Python遍历两个列表

3

我在教程中发现了这个不错的陈述:

    for x,y in [(x,y) for x in listA for y in listB]:

现在,就我而言,我理解这个语句会遍历listA和listB,x是listA中的一个值,y是listB中的一个值。但是,在这个示例中,这两个列表具有相同的长度。如果其中一个列表比另一个列表长,这个语句是否也会给我所有的配对,或者我需要使用不同的语句呢?
提前感谢。

6
这很容易用Python打个代码就可以回答了。如果你正在学习Python,你真的需要使用它。我并不是在批评你提问,只是建议你要亲自使用Python(在提示符处而不是编写程序) - 这是一个有用的技能,可以让你在进行快速实验时节省大量时间。 - andrew cooke
我在这个语法恐怖中找不到什么“好”的东西。正如你从@phihags的答案中刚刚发现的那样:你没有理解这行代码的含义。仅仅因为某些东西可以编译通过并不意味着它是正确的编码方式 - 这不容易阅读,因此违反了Python的主要原则之一。 - immortal
我并不完全确定,所以我想最好问一下,免得后悔 :-D - markus
2
@andrew cooke - 看起来提出问题的时间大约是在 Python 提示符中键入示例代码所需时间的三倍。为什么人们如此害怕首先尝试这些语句呢? - PaulMcG
没关系,你可以问!:o) 我只是想说,也许你不知道可以使用Python进行交互式操作,或者不知道它有多么有用.... - andrew cooke
@andrew 我总是忘记,我可以交互式地使用它 :-) - markus
3个回答

13
代码计算的是笛卡尔积(使用 itertools.product 函数),而不是你所建议的 zip 函数。

例如,如果输入为[1,2,3][4,5],则结果为:

(1,4)
(1,5)
(2,4)
(2,5)
(3,4)
(3,5)

zip([1,2,3], [4,5]) 做比较,结果是:

(1,4)
(2,5)

如您所见,zip (或 itertools.izip) 会丢弃较长参数中的额外项。

其变体 itertools.izip_longest 用任意值替换这些缺失元素。例如,itertools.izip_longest([1,2,3], [4,5], 99) 返回 :

(1,4)
(2,5)
(3,99)

1
OP 可能仍在寻找:http://docs.python.org/library/itertools.html#itertools.izip_longest - Felix Kling
所以将会有真正所有可能的配对,即使一个列表比另一个列表有更多的元素 编辑:啊,现在我看到了例子。谢谢 - markus
@markus:如果你得到了所有的组合,那么长度就不重要了。 - Felix Kling
@Felix Kling已经在编辑中包含了。已经包含了 ;) - phihag
"zip(..)确实需要两个输入长度相同。" -> 这不是真的,它会丢弃较长列表中的元素。 - Felix Kling
@Felix Kling 噢,现在好了吗? - phihag

6
这个示例将生成listAlistB中所有项目的组合。可以将其视为编写:
for x in listA:
    for y in listB:
        

0

我想为同时遍历两个列表添加一个答案。

alist = [1,2,3,4,5]
blist = [6,7,8,9,0]

for a,b in zip(alist,blist):
    print a,"+",b,'=',a+b

它将会输出如下结果

1 + 6 = 7
2 + 7 = 9
3 + 8 = 11
4 + 9 = 13
5 + 0 = 5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接