Python:Itertools groupby用于唯一键值对

时间:2015-09-22 23:53:52

标签: python csv group-by itertools

我正在尝试根据列对csv文件中的数据进行分组。我试过了:

from itertools import groupby
import csv
with open('path/trial.csv', 'rb') as f:
    reader = csv.reader(f)
    things = list(reader)

for key, group in groupby(things, lambda x: x[0]):
    listOfThings = len(",".join([thing[1] for thing in group]).split(","))
    print key + "," + str(listOfThings)

当第1列中的数据按特定顺序排列时,它起作用。如果重复,计数就会搞砸。

使用

A,1
A,2
A,1
B,0
B,8

我得到了

A,3
B,2

使用

A,1
A,2
B,0
B,8
A,1

我得到了

A,2
B,2
A,1

我希望我的脚本能够考虑唯一键和唯一值以及输出(仅使用A,1,但它存在两次):

A,2
B,2

根据Chad Simmon的评论,将其更改为:

sortedlist = list(reader)
things= sorted(sortedlist, key=operator.itemgetter(0), reverse=True)

它现在给了我

B,2
A,3

我想要A,2而不是。

2 个答案:

答案 0 :(得分:1)

我认为Chad Simmons的意思是如果你想在整个集合的上下文中确定唯一性,你应该使用groupby()以外的东西。但是,除了使用字典之外,我建议您使用set - 类似于一个 - 除了一个名为collections.Counter的字典的子类。

首先构造文件中所有唯一值对的set,然后构造Counter只考虑该对的第一个值的Counter(你称之为的)。如果您想要排序结果,您还需要对from collections import Counter import csv with open('trial.csv', 'rb') as f: unique_pairs = set((row[0], row[1]) for row in csv.reader(f)) for key, count in sorted(Counter(pair[0] for pair in unique_pairs).items()): print('{},{}'.format(key, count)) 的内容进行排序,因为它在字典中是无序的,如下所示。

from django.db.models.signals import pre_save, post_save

@receiver(pre_save)
def pre_save_handler(sender, instance, *args, **kwargs):
    # some case
    if case_error:
        raise Exception('OMG')

答案 1 :(得分:0)

通过这样做:

from itertools import groupby
import csv, operator, itertools
with open('trial.csv', 'rb') as f:
    reader = csv.reader(f)
    sortedlist = list(reader)
    things= sorted(sortedlist, key=operator.itemgetter(0), reverse=True)
    things.sort()
    things = list(k for k,_ in itertools.groupby(things))

for key, group in groupby(things, lambda x: x[0]):
    listOfThings = len(",".join([thing[1] for thing in group if not thing in things[1]]).split(","))
    print key + "," + str(listOfThings)