探マッチングキーに大人辞書のいかすことのできない
-
19-09-2019 - |
質問
私として対応する鍵を二つの異なる生成する事ができます。それぞれ約600k作品の応募がありました。
ったとえば:
myRDP = { 'Actinobacter': 'GATCGA...TCA', 'subtilus sp.': 'ATCGATT...ACT' }
myNames = { 'Actinobacter': '8924342' }
たい印刷の値Actinobacter(8924342ており、試合の値myRDP.
次のコードの作品が非常に遅い:
for key in myRDP:
for jey in myNames:
if key == jey:
print key, myNames[key]
たって、以下のものでも結果をKeyError:
for key in myRDP:
print myNames[key]
ですがにこのような機能を実施C?私ンターネットで調べも見た目には何も変わりませます。
感謝。
解決
は、内蔵のintersection
方法どの迅速であるべき、セットを使用します:
myRDP = { 'Actinobacter': 'GATCGA...TCA', 'subtilus sp.': 'ATCGATT...ACT' }
myNames = { 'Actinobacter': '8924342' }
rdpSet = set(myRDP)
namesSet = set(myNames)
for name in rdpSet.intersection(namesSet):
print name, myNames[name]
# Prints: Actinobacter 8924342
他のヒント
なにができること:
for key in myRDP:
if key in myNames:
print key, myNames[key]
初めての取り組みは遅いのでまったとの比較 毎 キー myRDPと 毎 キー myNames.アルゴリズム用語の場合はmyRDP n 要素myNamesは m 要素は、そのアルゴリズムのうO(n×m ください。のための600kの要素それぞれこれは360,000,000,000比較!
が試験るかどうかの特定の要素はキーが辞書で--実際、この特徴を生成する事ができます。アルゴリズムの key in dict
試験はO(1)または定します。その後、私のアルゴリズムについてO(n 時間、600,000の。
のpython 3であなただけ行うことができます。
myNames.keys() & myRDP.keys()
for key in myRDP:
name = myNames.get(key, None)
if name:
print key, name
キーが存在しない場合は、 dict.get
は、あなたがそれを与えるデフォルト値(この場合は、None
)を返します。
あなたは、共通鍵を見つけるし、それらを反復処理することから始めることができます。それらは、少なくともパイソンの最近のバージョンでは、Cで実装されているので、設定操作が高速である必要があります。
common_keys = set(myRDP).intersection(myNames)
for key in common_keys:
print key, myNames[key]
の代わりにget
メソッドを使用します:
for key in myRDP:
value = myNames.get(key)
if value != None:
print key, "=", value
ベストと最も簡単な方法は、単に一般的な集合演算(Pythonの3)を実行されるだろう。
a = {"a": 1, "b":2, "c":3, "d":4}
b = {"t1": 1, "b":2, "e":5, "c":3}
res = a.items() & b.items() # {('b', 2), ('c', 3)} For common Key and Value
res = {i[0]:i[1] for i in res} # In dict format
common_keys = a.keys() & b.keys() # {'b', 'c'}
乾杯!
コピーしてください辞書へ 一つ 辞書配列になります。この意味をなしているが、1:1の関係の値です。その後必要なもののみを検索、比較ループ、アクセスできる、関連する値。
例によ辞書配列:
[Name][Value1][Value2]
[Actinobacter][GATCGA...TCA][8924342]
[XYZbacter][BCABCA...ABC][43594344]
...
ここで辞書に交差点、労働組合、違い、およびその他のセット操作を行うための私のコードです:
class DictDiffer(object):
"""
Calculate the difference between two dictionaries as:
(1) items added
(2) items removed
(3) keys same in both but changed values
(4) keys same in both and unchanged values
"""
def __init__(self, current_dict, past_dict):
self.current_dict, self.past_dict = current_dict, past_dict
self.set_current, self.set_past = set(current_dict.keys()), set(past_dict.keys())
self.intersect = self.set_current.intersection(self.set_past)
def added(self):
return self.set_current - self.intersect
def removed(self):
return self.set_past - self.intersect
def changed(self):
return set(o for o in self.intersect if self.past_dict[o] != self.current_dict[o])
def unchanged(self):
return set(o for o in self.intersect if self.past_dict[o] == self.current_dict[o])
if __name__ == '__main__':
import unittest
class TestDictDifferNoChanged(unittest.TestCase):
def setUp(self):
self.past = dict((k, 2*k) for k in range(5))
self.current = dict((k, 2*k) for k in range(3,8))
self.d = DictDiffer(self.current, self.past)
def testAdded(self):
self.assertEqual(self.d.added(), set((5,6,7)))
def testRemoved(self):
self.assertEqual(self.d.removed(), set((0,1,2)))
def testChanged(self):
self.assertEqual(self.d.changed(), set())
def testUnchanged(self):
self.assertEqual(self.d.unchanged(), set((3,4)))
class TestDictDifferNoCUnchanged(unittest.TestCase):
def setUp(self):
self.past = dict((k, 2*k) for k in range(5))
self.current = dict((k, 2*k+1) for k in range(3,8))
self.d = DictDiffer(self.current, self.past)
def testAdded(self):
self.assertEqual(self.d.added(), set((5,6,7)))
def testRemoved(self):
self.assertEqual(self.d.removed(), set((0,1,2)))
def testChanged(self):
self.assertEqual(self.d.changed(), set((3,4)))
def testUnchanged(self):
self.assertEqual(self.d.unchanged(), set())
unittest.main()