如果行[0] 在 行[1] 则打印行

2 投票
1 回答
32505 浏览
提问于 2025-04-19 10:47

我有一个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 所做的,所以在这里使用列表更合适。

撰写回答