我正在尝试在两个不同的词典中找到相应的键。每个都有大约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中实现了这样的功能?我用Google搜索,但似乎没有任何效果。
感谢。
答案 0 :(得分:41)
你可以这样做:
for key in myRDP:
if key in myNames:
print key, myNames[key]
您的第一次尝试很慢,因为您将myRDP中的每个键与myNames中的每个键进行比较。在算法术语中,如果myRDP具有 n 元素且myNames具有 m 元素,则该算法将采用O( n × m < / strong>)操作。对于每个600k元素,这是360,000,000,000个比较!
但是测试特定元素是否是字典的关键字很快 - 事实上,这是字典的定义特征之一。在算法术语中,key in dict
测试是O(1)或恒定时间。所以我的算法将花费O( n )时间,这是600,000的时间。
答案 1 :(得分:36)
使用集合,因为它们有一个内置的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
答案 2 :(得分:8)
for key in myRDP:
name = myNames.get(key, None)
if name:
print key, name
如果密钥不存在, dict.get
会返回您提供的默认值(在本例中为None
)。
答案 3 :(得分:8)
在python 3中你可以做到
myNames.keys() & myRDP.keys()
答案 4 :(得分:6)
您可以先找到公共密钥,然后迭代它们。设置操作应该很快,因为它们是用C实现的,至少在现代版本的Python中实现。
common_keys = set(myRDP).intersection(myNames)
for key in common_keys:
print key, myNames[key]
答案 5 :(得分:2)
请改用get
方法:
for key in myRDP:
value = myNames.get(key)
if value != None:
print key, "=", value
答案 6 :(得分:1)
最好,最简单的方法就是简单地执行常见的set操作(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'}
干杯!
答案 7 :(得分:0)
将两个词典复制到一个词典/数组中。这是有道理的,因为你有1:1的相关值。那么你只需要一次搜索,没有比较循环,并且可以直接访问相关的值。
示例结果字典/数组:
[Name][Value1][Value2]
[Actinobacter][GATCGA...TCA][8924342]
[XYZbacter][BCABCA...ABC][43594344]
[Name][Value1][Value2]
[Actinobacter][GATCGA...TCA][8924342]
[XYZbacter][BCABCA...ABC][43594344]
...
答案 8 :(得分:0)
这是我在字典上执行交叉,联合,差异和其他设置操作的代码:
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()
答案 9 :(得分:0)
def combine_two_json(json_request, json_request2):
intersect = {}
for item in json_request.keys():
if item in json_request2.keys():
intersect[item]=json_request2.get(item)
return intersect
答案 10 :(得分:0)
您只需编写此代码,它将公共密钥保存在列表中。
common = [i for i in myRDP.keys() if i in myNames.keys()]