使用itertools.groupby:
import itertoolsimport operatordata=[(1, 'A', 'foo'), (2, 'A', 'bar'), (100, 'A', 'foo-bar'), ('xx', 'B', 'foobar'), ('yy', 'B', 'foo'), (1000, 'C', 'py'), (200, 'C', 'foo'), ]for key,group in itertools.groupby(data,operator.itemgetter(1)): print(list(group))
产量
[(1, 'A', 'foo'), (2, 'A', 'bar'), (100, 'A', 'foo-bar')][('xx', 'B', 'foobar'), ('yy', 'B', 'foo')][(1000, 'C', 'py'), (200, 'C', 'foo')]
或者,要创建一个将每个组作为子列表的列表,可以使用列表理解:
[list(group) for key,group in itertools.groupby(data,operator.itemgetter(1))]
to的第二个参数
itertools.groupby是一个
itertools.groupby适用于
data(第一个参数)中每个项目的函数。预期会传回
key。
itertools.groupby然后将相同的所有连续项目组合在一起
key。
operator.itemgetter(1)提取序列中的第二项。
例如,如果
row=(1, 'A', 'foo')
然后
operator.itemgetter(1)(row)
等于
'A'。
正如@eryksun在评论中指出的那样,如果元组的类别以某种随机顺序出现,那么您必须
data在应用之前首先进行排序
itertools.groupby。这是因为
itertools.groupy仅将具有相同密钥的
连续 项目收集到组中。
要按类别对元组进行排序,请使用:
data2=sorted(data,key=operator.itemgetter(1))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)