繁体   English   中英

通过CSV文件的多个或有迭代列表-Python

[英]Multiple contingent iteration lists through csv file - Python

我在运行Python 2.7.3的Windows 7 x64工作站上。

我有一个包含项目ID行的CSV文件,每一行都属于一个组ID,如下所示:

GroupID ItemID
a   1
a   2
a   3
b   4
b   5
b   6
c   7
c   8
c   9
etc…    

我需要做的是生成一个元组列表,其中每个元组是GroupID的字符串和与GroupID相关联的每个ItemID的列表,如下所示:

[('a', [1, 2, 3]), ('b', [4, 5, 6]), ('c', [7 , 8, 9])]

到目前为止,我已经考虑过使用函数或列表来设置转换以删除重复的GroupID列,然后在第二个循环中进行某种比较if语句。 有人可以给我一些建议吗? 谢谢!

您正在寻找itertools.groupby()

制作一个迭代器,从迭代器返回连续的键和组。 键是为每个元素计算键值的函数。 如果未指定或为None,则键默认为标识函数,并返回不变的元素。 通常,可迭代项需要已经在相同的键功能上进行了排序。

例如:

import csv
from itertools import groupby
from operator import itemgetter

with open("test.csv") as file:
    reader = csv.reader(file)
    next(reader) #Skip header
    data = groupby(reader, itemgetter(0))
    print([(key, [item for _, item in items]) for key, items in data])

我们将其与operator.itemgetter()结合起来,说我们要按行中的第一项分组,然后使用嵌套列表推导来提取所需的数据。

这给了我们:

[('a', ['1', '2', '3']), ('b', ['4', '5', '6']), ('c', ['7', '8', '9'])]

自然,除非需要列表,否则最好在此处使用生成器表达式来延迟执行操作。 (我们在这里使用列表推导来获得不错的输出)。

请注意,我假设您的文件像您说的那样用逗号分隔,而不是示例中所示。 如果使用制表符分隔,请使用csv.reader(file, dialect=csv.excel_tab)正确解析它。

如果分组密钥是顺序的,则类似于:

from itertools import groupby
from operator import itemgetter

data = [('a', 1), ('a', 2), ('b', 3), ('b', 5)]

grouped = [(k, map(itemgetter(1), g)) for k, g in groupby(data, itemgetter(0))]
# [('a', [1, 2]), ('b', [3, 5])]

否则,请使用collections.defaultdict

暂无
暂无

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

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