迭代两个字典并获取Python列表

时间:2015-12-16 10:07:57

标签: python list loops dictionary

我有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']

我已经搜索了其他问题,虽然其中一些是相似的,但我没有找到任何人解释一个这样的案例

2 个答案:

答案 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']