python:组合列表和字符串

时间:2014-08-06 21:00:16

标签: python

这是一个我似乎被困住的问题。我试图让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,但它会将每个角色视为一个单独的字符串。

谢谢!

1 个答案:

答案 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)