这是一个我似乎被困住的问题。我试图让python打印两个列表的每个组合。
# Test use case: This does what I expect:
lista = ['1', '2', '3', '4']
listb = ['a', 'b', 'c']
for x in lista:
for y in listb:
print x, y
##
## result summary -
## 1 a
## 1 b
## 1 c
## 2 a
## 2 b
## 2 c
## 3 a
## 3 b
## 3 c
## 4 a
## 4 b
## 4 c
# actual use case:
# test files:
## file_a contents =
## this is group 1:
## this is group 2:
## this is group 3:
##
##
## file_b contents =
## red,1,1,1
## blue,2,2,2
## green,3,3,3
## yellow,4,4,4
##
import csv
with open('file_b', 'r') as f:
reader = csv.reader(f)
with open('file_a', 'r') as template:
for line in template:
for row in reader:
print line, row[0]
结果开始像上面的(我想要的),但它只遍历file_a的第一行并停止。
有什么建议吗?关于为什么行为与案例A到B不同的想法?
我也一直在尝试使用itertools,但它会将每个角色视为一个单独的字符串。
谢谢!
答案 0 :(得分:3)
from itertools import product
lista = ['1', '2', '3', '4']
listb = ['a', 'b', 'c']
print (list(product(lista,listb)))
In [8]: lista = ['1', '2', '3', '4']
In [9]: listb = ['a', 'b', 'c']
In [10]: prod = (product(lista,listb))
In [11]: for x,y in prod:
....: print (x,y)
....:
1 a
1 b
1 c
2 a
2 b
2 c
3 a
3 b
3 c
4 a
4 b
4 c
itertools.product将为您完成工作。
输入可迭代的笛卡尔积。 等效于生成器表达式中的嵌套for循环。例如,对于B中的y,乘积(A,B)的返回值与(x中的x的(x,y)相同)。 这与做的基本相同:
[(x,y) for x in lista for y in listb]
您可以将您的行放在两个列表中并执行相同的操作:
with open('file_b', 'r') as f,open('file_a', 'r') as template:
lines = template.readlines()
lines2 = list(csv.reader(f))
prod = (product(lines,lines2))
for x,y in prod:
print (x,y)