1 python dictionary set-intersection
我已经很长时间没有学习Python了,而且有点生疏,但对于第一个问题,我正在使用一本字典,需要将它相交以返回键和值。例如,我要输入
a = {1:'a1', 2.5:'a2', 4:'a3'}
b = {1:'a1', 3:'a2', 5:'a4'}
Run Code Online (Sandbox Code Playgroud)
如果我进入c = intersect(a,b),我希望它返回{1:'a1'},但我只能返回{'a1'}。
到目前为止我的代码是:
def intersect(a, b):
for i in a:
if j in b:
if a[i]==b[i]:
return ({i})
else:
return {}
Run Code Online (Sandbox Code Playgroud)
您可以使用实际的 set交集来简化它。这仅保留共享项目(键和值相同):
def intersect(a, b):
return dict(a.items() & b.items())
Run Code Online (Sandbox Code Playgroud)
如果您的dict参数具有不可散列的值,您可以dict按照以下方式进行理解:
def intersect(a, b):
return {k: a[k] for k in a if b.get(k, not a[k]) == a[k]}
Run Code Online (Sandbox Code Playgroud)
您可以像这样修复原来的方法:
def intersect(a, b):
d = {}
for i in a:
if i in b and a[i] == b[i]:
d[i] = a[i]
return d
Run Code Online (Sandbox Code Playgroud)
这是该函数的一个版本intersect,它与键相交并使用第一个字典的值,这意味着在不同值的情况下,该函数会偏向第一个字典中的值:
def intersect(a, b):
return {k: a[k] for k in a.keys() & b.keys()}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为(自 Python 3 起)dict_keys返回的视图对象dict.keys()是集合(即 Implement collections.abc.Set)。
如果您想自定义将使用哪个值,我们可以使用一个函数,该函数接受两个值:
def intersect(a, b, select=lambda a, b: a):
return {k: select(a[k], b[k]) for k in a.keys() & b.keys()}
Run Code Online (Sandbox Code Playgroud)
我们也可以添加这些值,而不是返回其中一个值:
>>> intersect({'a': 4, 'b': 3}, {'a': 5}, lambda a, b: a + b)
{'a': 9}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6139 次 |
| 最近记录: |