您想要计算整个文件中的重复记录和记录。谁能帮我 。 count不应包含任何Counter或OrderedDict函数。 python 2.5.1版本中没有2个以上的函数
EasyCCE
答案 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)
希望其中一个是您正在寻找的!