在csv文件python中找到多个键上的重复计数和记录

时间:2016-01-25 13:19:26

标签: python csv

嘿iam使用python版本2.5.1。

您想要计算整个文件中的重复记录和记录。谁能帮我 。 count不应包含任何Counter或OrderedDict函数。 python 2.5.1版本中没有2个以上的函数

EasyCCE

4 个答案:

答案 0 :(得分:0)

如果条目的顺序不重要,我建议使用词典来跟踪重现:

sort_src = list("hello world") #for testing
seen = {}
for row1 in sort_src:
    seen[row1] = seen.get(row1,0) + 1
    #if the row is already in the dict then it's value is increased by 1
    #if the row is not in the dict then .get() returns 0 (then add 1

for r in seen:
    print(r,"occured",seen[r],"times")

如果行的顺序很重要,可以使用collections.OrderedDict()

来应用
import collections
seen = collections.OrderedDict()

无论哪种方式seen.keys()都会为您提供唯一条目的列表,.items()将是(条目,计数)元组的列表。

编辑 - 只需要计算总条目数(dict.values())所需的重复数,然后减去唯一条目数(字典数)

 num_of_dup_entries = sum(seen.values()) - len(seen)

答案 1 :(得分:0)

问题的标题提到“多个密钥”,我认为这意味着密钥由CSV字段的子集组成。由于您处于次数之后,您可以使用collections.Counter

import csv
from operator import itemgetter
from collections import Counter

key = itemgetter(0,2,4)    # for example: columns 0, 2 and 4 comprise the key

with open('data.csv') as f:
    c = Counter(key(row) for row in csv.reader(f))
    dups = [t for t in c.most_common() if t[1] > 1]
    # or, if you prefer a dict
    dups_dict = {row: count for row, count in c.most_common() if count > 1}

或者,如果您要比较整行,您的密钥可以是每一行:

from collections import Counter

with open('data.csv') as f:
    c = Counter(f)
    dups = [t for t in c.most_common() if t[1] > 1]
    dups_dict = {row: count for row, count in c.most_common() if count > 1}

在上述两种情况下,我都使用Counter.most_common()作为通过递减计数频率对dups列表进行排序的便捷方式。您可以使用Counter.items(),如果这不重要,或者如果您正在生成dups_dict,则没有固有顺序。

答案 2 :(得分:0)

len(dup_s_output) 

以上内容将返回列表中的项目数。

答案 3 :(得分:0)

在python 2.5中使用基本的计数器类可能会有所帮助:

class BasicCounter(dict):
    def update(self,iterable):
        for thing in iterable:
            self[thing] = self.get(thing,0) + 1

    def __init__(self,iterable=None):
        dict.__init__(self)
        if iterable:
            self.update(iterable)

所有其他发布的答案都在计算重复的rows而不是一行中的条目,以便逐个计算每一行的数量:

row_counts = []
for row in sort_src:
    row_count.append(BasicCounter(row))

或者要完全忽略行的分离并计算整个文件中的重复条目,您可以使用:

entry_count = BasicCounter()
for row in sort_src:
    entry_count.update(row)

希望其中一个是您正在寻找的!