如何使用itertools.zip_longest在嵌套列表中获取值

时间:2015-04-07 22:32:31

标签: python-3.x for-loop itertools

我有两个列表,我想使用itertool.zip_longest比较列表中的一些值并执行其他操作,这是我到目前为止编写的代码

import itertools

List1  = [['a'],['B']]
List2 = ['A','b','C']

for a in List1:
    for i in itertools.zip_longest(a,List2):
        print (i)

但这是我得到的结果,我仍然试图绕过这种行为

('a', 'A')
(None, 'b')
(None, 'C')
('B', 'A')
(None, 'b')
(None, 'C')

我正试图得到这样的东西

('a', 'A')
('B', 'b')
(None, 'C')

所以我可以直接比较这些值

2 个答案:

答案 0 :(得分:2)

您可以使用生成器表达式来展平list1:

List1  = [['a'],['B']]
List2 = ['A','b','C']

print(list(itertools.zip_longest((b for a in List1 for b in a),List2))
[('a', 'A'), ('B', 'b'), (None, 'C')]

如果你想比较解压缩zip_longest对象:

for a, b in itertools.zip_longest((b for a in List1 for b in a),List2):
    if a == b:
        # do whatever

要设置特定的defualt值,请使用fillvalue:

List1  = [['a'],['B']]
List2 = ['A','b','C']

print(list(itertools.zip_longest((b for a in List1 for b in a),List2,fillvalue="foo")))
[('a', 'A'), ('B', 'b'), ('foo', 'C')]

答案 1 :(得分:1)

对于该结果,您需要使用a展平您可以执行此操作的列表itertools.chain

>>> list(itertools.izip_longest(itertools.chain(*List1),List2))
[('a', 'A'), ('B', 'b'), (None, 'C')]