【问题标题】:Finding repeats in multiple lists read from CSV File (Python)在从 CSV 文件 (Python) 读取的多个列表中查找重复项
【发布时间】:2011-05-07 08:22:56
【问题描述】:

标题似乎令人困惑,但假设我正在使用以下 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 真的很陌生(嗯,完全是编程),所以我几乎不知道我在做什么..

干杯

【问题讨论】:

    标签: python csv


    【解决方案1】:

    总而言之(并显示正确的 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
    

    更新回应评论:

    无论您是否使用 DictReader 方法,您都需要通读整个 CSV 文件。如果你想例如忽略“name2”列(不是行),然后忽略它。您不需要像使用变量名“rows”所暗示的那样保存所有数据。这是一种更通用方法的代码,它不依赖于列标题按特定顺序排列,并允许选择/拒绝特定列。

        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
    

    【讨论】:

    • 谢谢!这非常有效,但是因为您忽略了标题行,它会读取整个 CSV 文件。如果我想计算某个名称出现在 CSV 文件中 3 行中的 2 行中的次数怎么办?即 CSV 文件包含“name1”、“name2”、“name3”,但我只想计算“name1”和“name3”行中的名称,因此完全忽略“name2”行..
    • 这很有意义。我现在终于明白了。 :) 再次感谢
    【解决方案2】:

    我会这样做:

    >>> 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(计数> = 3)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 2013-01-21
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多