我有2个词典(d3和d4),我想查看其中一个词典(d3)的值是否在另一个词典(d4)的键中,并且在这种情况下保存该词典的值( d4)进入新名单。
d3 = {0: ['mo', 'A', 'la'], 1: ['tel', 'A', 'Al'], 2: ['Jak', 'E', 'Pum']}
d4 = {'ko' : 'Paul', 'la' : 'John', 'si' : 'Peter', 'Al' : 'Laura', 'gh' : 'Will'}
a3 = d3.values()
b3 = d3.keys()
a4 = d4.values()
b4 = d4.keys()
t = 0
for i in a3:
if i not in b4 == -1:
continue
else:
taxa = a4[t]
t += 1
print taxa
使用此代码我没有得到预期的结果,应该是:
taxa = ['John', 'Laura']
如果d3的值不在d4的键中,那么如果它可以在列表中返回'unknown'则会很好。所以在这种情况下理想的结果是这样的:
taxa = ['John', 'Laura', 'unknown']
我已经搜索了其他问题,虽然其中一些是相似的,但我没有找到任何人解释一个这样的案例
答案 0 :(得分:3)
以下是您可以这样做的方法:
>>> d3 = {0: ['mo', 'A', 'la'], 1: ['tel', 'A', 'Al'], 2: ['Jak', 'E', 'Pum']}
>>> d4 = {'ko' : 'Paul', 'la' : 'John', 'si' : 'Peter', 'Al' : 'Laura', 'gh' : 'Will'}
>>> taxa = []
>>>
>>> for l in d3.values():
... v = next((d4[item] for item in l if item in d4), 'Unknown')
... taxa.append(v)
...
>>> taxa
['John', 'Laura', 'Unknown']
next()
将返回传递的生成器表达式中的第一个匹配元素。如果找不到任何内容,将返回'Unknown'
。
这些可以组合成单列表理解:
>>> [next((d4[item] for item in l if item in d4), 'Unknown') for l in d3.values()]
['John', 'Laura', 'Unknown']
答案 1 :(得分:0)
您还可以使用chain.from_iterable
模块中的set comprehensions和itertools
。
>>> from itertools import chain
>>> d4 = {'ko' : 'Paul', 'la' : 'John', 'si' : 'Peter', 'Al' : 'Laura', 'gh' : 'Will'}
>>> d3 = {0: ['mo', 'A', 'la'], 1: ['tel', 'A', 'Al'], 2: ['Jak', 'E', 'Pum']}
>>> d3keys = set(chain.from_iterable(d3.values()))
>>> {value if key in d3keys else 'unknown' for key, value in d4.items()}
{'Laura', 'John', 'unknown'}
或
>>> [value if key in d3keys else 'unknown' for key, value in d4.items()]
['unknown', 'unknown', 'unknown', 'Laura', 'John']