如何按排序顺序对列表中的项目进行分组?
How can I group the items in a list in sorted order?
我有一些包含这样的元组的列表
one = [(4, 'a'), (3, 'b'), (2, 'c'), (3, 'd'), (5, 'e'), (6, 'f')]
并且我想根据该整数对第一个列表中的项目进行分组,以创建具有如下输出的新数组
final = [(g1, 2, ['c']), (g2, 3, ['b','d']), (g3, 4, ['a']), (g4, 5, ['e']), (g5, 6, ['f'])]
我不知道如何创建最终列表。 python 是怎么做到的?任何想法,将不胜感激。谢谢。
注:g1、g2等只是一些带增量的字符串。
我认为最好的解决方案是从 int -> list 创建一个字典。遍历原始列表,如果 int 是一个键,则只需将其添加到其列表中,否则创建一个包含其值的列表并将其添加到字典中。
既然要对输出进行排序,那么可以根据第一个元素对原始列表进行排序
>>> first = lambda x: x[0]
>>> one_sorted = sorted(one, key=first)
然后你可以根据 itertools.groupby
的第一个元素对元素进行分组,就像这样
groupby(one_sorted, first)
因为你想按升序给组分配数字,你可以像这样用enumerate
包裹它
enumerate(groupby(one_sorted, first), 1)
然后你可以在 for
循环中 unpack enumerate
的结果,就像这样
for index, (item, group) in enumerate(groupby(one_sorted, first), 1)
现在您只需构建结果列表。你可以使用 list comprehension 来做到这一点,像这样
>>> 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'])]
[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']}
然后 return 将 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'])]
您可以使用默认字典对项目进行分组:
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)]
我有一些包含这样的元组的列表
one = [(4, 'a'), (3, 'b'), (2, 'c'), (3, 'd'), (5, 'e'), (6, 'f')]
并且我想根据该整数对第一个列表中的项目进行分组,以创建具有如下输出的新数组
final = [(g1, 2, ['c']), (g2, 3, ['b','d']), (g3, 4, ['a']), (g4, 5, ['e']), (g5, 6, ['f'])]
我不知道如何创建最终列表。 python 是怎么做到的?任何想法,将不胜感激。谢谢。
注:g1、g2等只是一些带增量的字符串。
我认为最好的解决方案是从 int -> list 创建一个字典。遍历原始列表,如果 int 是一个键,则只需将其添加到其列表中,否则创建一个包含其值的列表并将其添加到字典中。
既然要对输出进行排序,那么可以根据第一个元素对原始列表进行排序
>>> first = lambda x: x[0]
>>> one_sorted = sorted(one, key=first)
然后你可以根据 itertools.groupby
的第一个元素对元素进行分组,就像这样
groupby(one_sorted, first)
因为你想按升序给组分配数字,你可以像这样用enumerate
包裹它
enumerate(groupby(one_sorted, first), 1)
然后你可以在 for
循环中 unpack enumerate
的结果,就像这样
for index, (item, group) in enumerate(groupby(one_sorted, first), 1)
现在您只需构建结果列表。你可以使用 list comprehension 来做到这一点,像这样
>>> 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'])]
[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']}
然后 return 将 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'])]
您可以使用默认字典对项目进行分组:
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)]