繁体   English   中英

Python:Itertools groupby提供唯一的键值对

[英]Python: Itertools groupby for unique key value pairs

我正在尝试基于列将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代替。

我认为Chad Simmons的意思是,如果要在整个集合的上下文中确定唯一性,则应使用groupby()以外的其他方式。 但是,除了建议使用字典的子类collections.Counter之外,我建议您使用一个类似于set ,而不是使用字典。

首先构造文件中所有唯一值对的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 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM