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

通过csv文件的多个或有迭代列表-Python,python,csv,iteration,Python,Csv,Iteration,我在运行Python2.7.3的Windows7x64工作站上 我有一个CSV文件,其中包含多行项目ID,每行都属于一个组ID,如下所示: GroupID ItemID a 1 a 2 a 3 b 4 b 5 b 6 c 7 c 8 c 9 etc… [('a', [1, 2, 3]), ('b', [4, 5, 6]), ('c', [7 , 8, 9])] 我需要做的是生成一个元组列表,其中每个元组是GroupID的字符串,以及与GroupID

我在运行Python2.7.3的Windows7x64工作站上

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

GroupID ItemID
a   1
a   2
a   3
b   4
b   5
b   6
c   7
c   8
c   9
etc…    
[('a', [1, 2, 3]), ('b', [4, 5, 6]), ('c', [7 , 8, 9])]
我需要做的是生成一个元组列表,其中每个元组是GroupID的字符串,以及与GroupID关联的每个ItemID的列表,如下所示:

GroupID ItemID
a   1
a   2
a   3
b   4
b   5
b   6
c   7
c   8
c   9
etc…    
[('a', [1, 2, 3]), ('b', [4, 5, 6]), ('c', [7 , 8, 9])]
到目前为止,我考虑过使用函数或列表来设置转换以消除GroupID列的重复,然后在第二个循环中执行某种形式的比较if语句。谁能给我一些建议吗?谢谢

您正在寻找:

生成一个迭代器,从 难以忍受。键是一个函数,为每个键计算一个键值 元素。如果未指定或为“无”,则键默认为标识 函数并返回未更改的元素。一般说来,这个问题是无法解决的 需要已经在同一个键函数上排序

例如:

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])
我们将其与一个表示我们希望按行中的第一项分组的语句结合起来,然后使用嵌套语句提取我们想要的数据

这给了我们:

[('a', ['1', '2', '3']), ('b', ['4', '5', '6']), ('c', ['7', '8', '9'])]
当然,除非您需要一个列表,否则最好在这里使用生成器表达式惰性地执行操作。(我们在这里使用列表理解来获得良好的输出)


请注意,我假设您的文件像您所说的那样是逗号分隔的,而不是如示例中所示。如果它是选项卡分隔的,请使用
csv.reader(file,dialogue=csv.excel\u 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

注意,使用
map()
操作符.itemgetter()
的可读性非常差,而且也非常重要(⅓ 在我的测试中)比使用列表理解和索引或元组解包并扔掉第一部分慢(
[i[1]代表i in g]
[i for uu,i in g]
)。@Lattyware“可读性差得多”我提出异议,但在其他方面——这一点很公平。