使用列表推导式的嵌套 for 循环

115 投票
4 回答
107537 浏览
提问于 2025-04-16 03:39

如果我有两个字符串,'abc''def',我可以用两个循环来获取它们的所有组合:

for j in s1:
  for k in s2:
    print(j, k)

不过,我想用列表推导式来实现这个功能。我试过很多方法,但一直没成功。有没有人知道怎么做呢?

4 个回答

1

这只是一个现成的版本,参考了@miles82 的回答(请给应有的认可):

from itertools import product
list(map(list, product('abc', 'def') ))

输出结果:

[['a', 'd'],
 ['a', 'e'],
 ['a', 'f'],
 ['b', 'd'],
 ['b', 'e'],
 ['b', 'f'],
 ['c', 'd'],
 ['c', 'e'],
 ['c', 'f']]

如果你想知道为什么我们需要 list(map(list - itertools.product 返回的是一个迭代器。

43

因为这实际上是一个笛卡尔积,所以你也可以使用 itertools.product。我觉得这样更清晰,特别是当你有更多的输入可迭代对象时。

itertools.product('abc', 'def', 'ghi')
176
lst = [j + k for j in s1 for k in s2]

或者

lst = [(j, k) for j in s1 for k in s2]

如果你想要元组的话。

就像问题中提到的,for j... 是外层循环,for k... 是内层循环。

其实,在列表推导式中,你可以根据需要添加任意数量的独立的 'for x in y' 语句,只需一个接一个地写就可以了。

为了让代码更易读,可以使用多行来书写:

lst = [
       j + k         # result
       for j in s1   # for loop 
         for k in s2 # for loop
                     # condition   
       ]

撰写回答