好的,所以我非常擅长用多个“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的所有组合的字符串列表。
答案 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']