Python遍历两个列表

3 投票
3 回答
1020 浏览
提问于 2025-04-17 01:14

我在一个教程中发现了这样一句话:

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

对我来说,我明白这个语句会遍历listA和listB,其中x是listA中的一个值,y是listB中的一个值。但是在这个例子中,这两个列表的长度是一样的。如果其中一个列表比另一个长,这个语句还能给我所有的配对吗?还是说我需要用不同的语句?

提前谢谢你。

3 个回答

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
6

这个例子会生成 listAlistB 中所有项目的所有组合。可以把它想象成是在写

for x in listA:
    for y in listB:
        …
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)

撰写回答