【问题标题】:if row[0] in row[1] print row如果行 [1] 中的行 [0] 打印行
【发布时间】:2014-10-27 02:47:36
【问题描述】:

我有一个包含 2 列的 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 列表中找到它,如果找到则打印。不看它是否彼此相邻并打印它。

【问题讨论】:

  • 您需要遍历csv 一次以列出所有row[1] 元素。然后你实际上会有一个列表,你可以在上面进行in 比较。当前的方式,您只是将一个元素与另一个元素进行比较。
  • 在给它一个参数之前,我如何让它遍历整个事情一次?
  • 您的标题显示“如果行 [1] 中的行 [0]”。您的描述说“我只是想弄清楚行 [1] 是否在行 [0] 中。”你意识到那些不是一回事,对吧?
  • 是的,那是我的错。抱歉,当我指定行时,我不知道如何调用它,因为无论如何它都会调用相同的东西。将它们作为一个列表是我如何发现我说了同样的话并且没有理解它的原因。只是我在这方面是个菜鸟......

标签: python list csv for-loop


【解决方案1】:

当您说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()sets 已针对在其中查找值进行了优化,这就是我们正在做的所有事情。 list 针对循环遍历每个元素进行了优化,这就是我们对 first_col 所做的,所以在那里更有意义。

【讨论】:

  • 我现在觉得自己很愚蠢......你的解释是正确的!我非常感谢您的回答。非常感谢朋友!
  • 很好的解释——但使用second_col 的集合可能更好——它在概念上更清晰,启动速度更快。
  • @abarnert 好点,我根据您的建议更改了答案。
  • 现在我明白为什么我们应该将这些与列表和集合分开了。我有很多东西要学,但很感激你们两个向我解释这一点。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-02-12
  • 2022-01-15
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多