使用Python列表理解有点像拉链

时间:2013-11-08 13:21:08

标签: python list list-comprehension

好的,所以我非常擅长用多个“for”编写Python列表推导,但我想要更好。我想知道线路是否正确

>>> [S[j]+str(i) for i in range(1,11) for j in range(3) for S in "ABCD"]

可以修改为返回["A1","B1","C1","D1","A2","B2","C2","D2"...(etc.)]

之类的内容

如果没有,如果有一个列表推导可以返回相同的列表,即“ABCD”和1到10的所有组合的字符串列表。

5 个答案:

答案 0 :(得分:7)

你有太多的循环。您根本不需要j

这就是诀窍:

[S+str(i) for i in range(1,11) for S in "ABCD"]

答案 1 :(得分:1)

您可以像这样使用itertools.product

import itertools
print [item[1] + str(item[0]) for item in itertools.product(range(1, 11),"ABCD")]

<强>输出

['A1', 'B1', 'C1', 'D1', 'A2', 'B2', 'C2', 'D2', 'A3', 'B3', 'C3', 'D3', 'A4',
 'B4', 'C4', 'D4', 'A5', 'B5', 'C5', 'D5', 'A6', 'B6', 'C6', 'D6', 'A7', 'B7',
 'C7', 'D7', 'A8', 'B8', 'C8', 'D8', 'A9', 'B9', 'C9', 'D9', 'A10', 'B10', 'C10',
 'D10']

答案 2 :(得分:1)

我希望在列表推导中看到多个for循环的方式就像嵌套循环一样。将下一个for循环视为嵌套在第一个循环中的循环,这将使整个过程更容易。添加丹尼尔的回答:

[S+str(i) for i in range(1,11)  for S in "ABCD"]

只不过是:

new_loop=[]
for i in range (1,11):
    for S in "ABCD:
         new_loop.append(S+str(i))

答案 3 :(得分:1)

每当你考虑将所有元素组合在一起,如果一个iterable与另一个iterable的所有元素相结合时,请考虑使用itertools.product。它是两组(或列表)的笛卡尔积。

我找到的解决方案比现在提供的解决方案略快一些。比@daniel解决方案快2倍以上(尽管他的解决方案看起来更优雅):

import itertools
[x + y for (x,y) in (itertools.product('ABCD', map(str,range(1,5))))]

这里的不同之处在于我使用map将int转换为字符串。在向量上应用函数通常比在单个项目上应用函数更快。

处理复杂理解时的一般性提示:

当你在理解中有很多条件和很多条件时,把它分成几行,如:

[S[j]+str(i) for i in range(1,11)
             for j in range(3) 
             for S in "ABCD"]

在这种情况下,阅读方便性的变化不是很大,但是,当你有很多条件和大量的条件时,它会产生很大的差异。它就像编写for循环和if语句嵌套,但没有“:”和标识。

使用常规fors查看代码:

ans = []
for i in range(1,11):
    for j in range(3): 
        for S in "ABCD": 
            ans.append(S[j] + str(i))

几乎相同的事情:)

答案 4 :(得分:0)

为什么不使用itertools.product?

>>> import itertools
>>> [ i[0] + str(i[1]) for i in itertools.product('ABCD', range(1,5))]
 ['A1', 'A2', 'A3', 'A4', 'B1', 'B2', 'B3', 'B4', 'C1', 'C2', 'C3', 'C4', 'D1', 'D2', 'D3', 'D4']