从CSV文件(Python)中读取多个列表中的重复项

时间:2011-05-07 08:22:57

标签: python csv

标题似乎令人困惑,但让我说我正在使用以下CSV文件('names.csv')。

    name1,name2,name3
    Bob,Jane,Joe
    Megan,Tom,Jane
    Jane,Joe,Rob

我的问题是,我将如何制作返回至少发生3次字符串的代码。所以输出应该是'Jane',因为它至少发生了3次。在这里真的很困惑..也许一些示例代码会帮助我更好地理解?

到目前为止,我有:

    import csv
    reader = csv.DictReader(open("names.csv"))

    for row in reader:
        names = [row['name1'], row['name2'], row['name3']]
        print names

返回:

    ['Bob', 'Jane', 'Joe']
    ['Megan', 'Tom', 'Jane']
    ['Jane', 'Joe', 'Rob']

我从哪里开始?或者我错了吗?我是Python的新手(好吧,完全编程),所以我几乎不知道我在做什么..

干杯

2 个答案:

答案 0 :(得分:0)

我会这样做:

>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> rows = [['Bob', 'Jane', 'Joe'],
... ['Megan', 'Tom', 'Jane'],
... ['Jane', 'Joe', 'Rob']]
...
>>> for row in rows:
...     for name in row:
...         d[name] += 1
... 
>>> filter(lambda x: x[1] >= 3, d.iteritems())
[('Jane', 3)]

它使用默认值为0的dict来计算文件中每个名称发生的次数,然后根据条件过滤dict(count> = 3)。

答案 1 :(得分:0)

完全放置(并显示正确的csv.reader用法):

import csv
import collections
d = collections.defaultdict(int)
with open("names.csv", "rb") as f: # Python 3.x: use newline="" instead of "rb"
    reader = csv.reader(f):
    reader.next() # ignore useless heading row
    for row in reader:
        for name in row:
            name = name.strip()
            if name:
                d[name] += 1
 morethan3 = [(name, count) for name, count in d.iteritems() if count >= 3]
 morethan3.sort(key=lambda x: x[1], reverse=True)
 for name, count in morethan3:
    print name, count

更新以回应评论:

您需要阅读整个CSV文件是否使用DictReader方法。如果你想要,例如忽略'name2'列( not row ),然后忽略它。您不需要保存所有数据,因为您使用变量名“行”表示。下面是一个更通用的方法的代码,它不依赖于列标题按特定顺序排列,并允许选择/拒绝特定列。

    reader = csv.DictReader(f):
    required_columns = ['name1', 'name3'] #### adjust this line as needed ####
    for row in reader:
        for col in required_columns:
            name = row[col].strip()
            if name:
                d[name] += 1