如何按排序顺序对列表中的项目进行分组?

时间:2015-03-31 03:44:46

标签: python list tuples grouping

我有一些列表,包含像这样的元组

one = [(4, 'a'), (3, 'b'), (2, 'c'), (3, 'd'), (5, 'e'), (6, 'f')]

我想基于该整数对列表1上的项目进行分组,以创建具有此类输出的新数组

final = [(g1, 2, ['c']), (g2, 3, ['b','d']), (g3, 4, ['a']), (g4, 5, ['e']), (g5, 6, ['f'])]

我不知道在创建最终列表。 python是如何做到的?任何想法,将不胜感激。谢谢。

注意: g1,g2等只是一些带增量的字符串。

3 个答案:

答案 0 :(得分:7)

由于您希望对输出进行排序,因此您可以根据第一个元素

对原始列表进行排序
>>> first = lambda x: x[0]
>>> one_sorted = sorted(one, key=first)

然后你可以根据itertools.groupby的第一个元素对元素进行分组,就像这个

一样
groupby(one_sorted, first)

因为您想按升序将数字分配给组,所以可以用enumerate这样包装它

enumerate(groupby(one_sorted, first), 1)

然后你可以在enumerate循环中for for index, (item, group) in enumerate(groupby(one_sorted, first), 1) 的结果,就像这样

>>> from itertools import groupby
>>> [(index, item, [j[1] for j in group])
...     for index, (item, group) in enumerate(groupby(one_sorted, first), 1)]
[(1, 2, ['c']), (2, 3, ['b', 'd']), (3, 4, ['a']), (4, 5, ['e']), (5, 6, ['f'])]

现在你只需要构建结果列表。您可以使用unpack来执行此操作,例如

[j[1] for j in group]

>>> groups = {} >>> for number, string in one: ... groups.setdefault(number, []).append(string) ... ... >>> groups {2: ['c'], 3: ['b', 'd'], 4: ['a'], 5: ['e'], 6: ['f']} 实际上迭代分组的项目并获取第二个项目,即实际的字符串。


或者,您可以将字符中的元素分组,例如

enumerate

然后返回在排序字典上应用>>> [(index, number, groups[number]) ... for index, number in enumerate(sorted(groups), 1)] [(1, 2, ['c']), (2, 3, ['b', 'd']), (3, 4, ['a']), (4, 5, ['e']), (5, 6, ['f'])] ,就像这样

{{1}}

答案 1 :(得分:1)

您可以使用默认字典对项目进行分组:

from collections import defaultdict

# create dictionary # {2: ['c'], 3: ['b', 'd'], 4: ['a'], ...}
groups = defaultdict(list)
for k,v in one:
    groups[k].append(v)

# create sorted list [(1, (2, ['c'])), (2, (3, ['b', 'd'])), (3, (4, ['a'])), ...]
lists = enumerate(sorted(list(groups.items())), 1)

注意:上面会生成一个枚举器,它是类似于生成器的对象(see here)。如果要转换为普通列表,只需将最后一行替换为:

lists = [(i,k,v) for i,(k,v) in enumerate(sorted(list(groups.items())), 1)]

答案 2 :(得分:0)

我认为最好的解决方案是从int创建字典 - >名单。浏览原始列表,如果int是一个键,则只需将其添加到其列表中,否则创建一个包含其值的列表并将其添加到字典中。

相关问题