如果行[0] 在 行[1] 则打印行
我有一个csv文件,里面有两列。我只是想弄清楚每个row[0]
的值是否在某个row[1]
中,如果找到了,就打印出row
。
csv文件中的内容:
COL1, COL2
1-A, 1-A
1-B, 2-A
2-A, 1-B
2565, 2565
51Bc, 51Bc
5161, 56
811, 65
681, 11
55, 3
3, 55
代码:
import csv
doc= csv.reader(open('file.csv','rb'))
for row in doc:
if row[0] in row[1]:
print row[0]
最终的结果应该是:
1-A
1-B
2-A
2565
51Bc
55
3
但是,它给我的结果是:
1-A
2565
51Bc
它打印那些数字是因为它们是并排放在一起的,但我需要的是先取COL1中的第一个项目,看看它是否在整个COL2列表中,如果找到了就打印出来,而不是只看它们是否并排在一起。
1 个回答
3
当你写 for row in doc
的时候,其实只是在一次循环中获取一对元素,并把它们放到 row
里。所以,row[1]
这个位置不可能同时包含整列的数据。你需要先做一次循环,把那一列的数据提取成一个列表,然后再对 csv
文件进行第二次循环来进行比较。实际上,你可以把两列数据分别存储在不同的列表里,这样只需要打开文件一次。
import csv
doc= csv.reader(open('file.csv','rb'))
# Build the lists.
first_col = []
second_col = set()
for row in doc:
first_col.append(row[0])
second_col.add(row[1])
# Now actually do the comparison.
for item in first_col:
if item in second_col:
print item
根据 abarnert 的建议,我们对第二列使用了 set()
。set
是为了快速查找里面的值而优化的,这正好符合我们的需求。而 list
则是为了遍历每一个元素而优化的,这就是我们对 first_col
所做的,所以在这里使用列表更合适。