2017-04-20 100 views
2

不确定为什么我不能弄清楚这一点,但我希望程序查看2个字典,如果密钥匹配,我希望它打印密钥随着来自像这样两个字典的值..检查两个不同字典中的相同密钥,打印密钥和两个值

[结果]

a 1 2 
b 2 4 
c 3 6 
d 4 8 

[CODE]

from collections import Counter 

a = Counter({'a':1,'b':2,'c':3,'d':4}) 
b = Counter({'a':2,'b':4,'c':6,'d':8}) 

for key in b.most_common(): 
    if set(a.keys()) == set(b.keys()): 
     print(key) 

回答

4

您可以通过这两个按键的set intersection迭代:

>>> set(a.keys()) & set(b.keys()) 
set(['a', 'c', 'b', 'd']) 

下面是与类型的字典是不完全类似的例子:

from collections import Counter 

a = Counter({'a':1,'b':2,'c':3,'d':4,'e':5}) 
b = Counter({'a':2,'b':4,'c':6,'d':8,'f':7}) 

common_keys = set(a.keys()) & set(b.keys()) 

for key in common_keys: 
    print("%s %d %d" % (key, a[key], b[key])) 
# a 1 2 
# c 3 6 
# b 2 4 
# d 4 8 

请注意,转换到set不preverse的Counter顺序。

你可以转换setlist,并根据这两个值的总和进行排序:

a = {'a':1,'b':2,'c':3,'d':4,'e':5} 
b = {'a':2,'b':4,'c':6,'d':8,'f':7} 

common_keys = list(set(a.keys()) & set(b.keys())) 

common_keys.sort(key=lambda k: a[k] + b[k], reverse=True) 

for key in common_keys: 
    print("%s %d %d" % (key, a[key], b[key])) 
# d 4 8 
# c 3 6 
# b 2 4 
# a 1 2 

最后,如果你不关心根据其值之和排序的关键,这里是你的代码稍加修改的版本:

from collections import Counter 

a = Counter({'a':1,'b':2,'c':3,'d':4}) 
b = Counter({'a':2,'b':4,'c':6,'d':8}) 

for key, a_value in a.most_common(): 
    if key in b: 
     print("%s %d %d" % (key, a_value, b[key])) 
+0

是不是将一个集合转换为一个列表,然后对它进行一些过度设计?我认为在这种情况下简单地遍历'most_common'中的键然后进行成员测试是很容易的,因此您只需要一次传递。 –

+0

@ juanpa.arrivillaga:是的。我仍然想保留most_common功能。感谢评论,我更新了代码,但后来认识到它基本上是你已经写的。 –

+0

嗯,我不是荷兰人或类似的东西,但我想应该只有一个明显的方法来做到这一点;) –

0
common_keys = sorted(set(a.keys()).intersection(b.keys())) 

for key in common_keys: 
    print(key, a[key], b[key]) 
+0

请确保您解释以及 –

0

你几乎在那里,你if条件是关闭,most_common返回元组列表,所以你需要解压的键值对

>>> a = Counter({'a':1,'b':2,'c':3,'d':4}) 
>>> b = Counter({'a':2,'b':4,'c':6,'d':8}) 
>>> for key, bval in b.most_common(): 
...  if key in a: 
...   print(key, a[key], bval) 
... 
d 4 8 
c 3 6 
b 2 4 
a 1 2 
>>> 

如果你不关心顺序,(即你不需要拨打most_common),你可以迭代交叉点。在Python 3,这是很简单的:

>>> a.keys() & b.keys() 
{'d', 'a', 'c', 'b'} 
>>> 

因为.keys实际上返回更像一组比列表的视图。

>>> for common_key in a.keys() & b.keys(): 
...  print(common_key, a[common_key], b[common_key]) 
... 
d 4 8 
a 1 2 
c 3 6 
b 2 4 
>>> 
+0

这很好用!当我将它合并到我的代码中时,但是我得到一个错误ValueError:解压缩的值太多(预期为2):/ – k5man001

+0

@ rogernm001 uhhh您看到终端会话的输出,所以我不确定究竟是什么造成的那个错误。我猜这是来自'关键,Bval ...'线? –

+0

是的那条线..我的字典中的实际数据就像这样a = {('192.168.10.2',7),('192.168.10.5',11)...} AND b = {('192.168.10.2 ',65596),('192.168.10.5,95943 ...)} ...这可能是原因吗? – k5man001

相关问题