检查 2 个不同字典中的相同键,打印键和两个值
Check for same key in 2 different dictionaries, print the key and both values
不知道为什么我无法弄清楚,但我希望程序查看 2 个字典,如果键匹配,我希望它打印键以及两个字典中的值,就像这样......
[结果]
a 1 2
b 2 4
c 3 6
d 4 8
[代码]
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)
您可以遍历两个键的 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
不会颠倒 Counter
顺序。
您可以将 set
转换为 list
并根据两个值的总和对其进行排序:
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]))
common_keys = sorted(set(a.keys()).intersection(b.keys()))
for key in common_keys:
print(key, a[key], b[key])
你快到了,你的 if
条件已关闭,most_common
returns 元组 的列表,所以你需要解压键值对
>>> 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
实际上 returns 一个视图更像是一个集合而不是一个列表。
>>> 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
>>>
不知道为什么我无法弄清楚,但我希望程序查看 2 个字典,如果键匹配,我希望它打印键以及两个字典中的值,就像这样......
[结果]
a 1 2
b 2 4
c 3 6
d 4 8
[代码]
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)
您可以遍历两个键的 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
不会颠倒 Counter
顺序。
您可以将 set
转换为 list
并根据两个值的总和对其进行排序:
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]))
common_keys = sorted(set(a.keys()).intersection(b.keys()))
for key in common_keys:
print(key, a[key], b[key])
你快到了,你的 if
条件已关闭,most_common
returns 元组 的列表,所以你需要解压键值对
>>> 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
实际上 returns 一个视图更像是一个集合而不是一个列表。
>>> 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
>>>