Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按排序顺序将列表中的项目分组?_Python_List_Tuples_Grouping - Fatal编程技术网

Python 如何按排序顺序将列表中的项目分组?

Python 如何按排序顺序将列表中的项目分组?,python,list,tuples,grouping,Python,List,Tuples,Grouping,我有一些由这样的元组组成的列表 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'])] groupby(one_sorted, first) enumerate(groupby(one_sorted, first), 1) fo

我有一些由这样的元组组成的列表

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'])]
groupby(one_sorted, first)
enumerate(groupby(one_sorted, first), 1)
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'])]
>>> groups = {}
>>> for number, string in one:
...     groups.setdefault(number, []).append(string)
...     
... 
>>> groups
{2: ['c'], 3: ['b', 'd'], 4: ['a'], 5: ['e'], 6: ['f']}
>>> [(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中的项进行分组,以创建一个新的数组,该数组的输出如下

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'])]
groupby(one_sorted, first)
enumerate(groupby(one_sorted, first), 1)
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'])]
>>> groups = {}
>>> for number, string in one:
...     groups.setdefault(number, []).append(string)
...     
... 
>>> groups
{2: ['c'], 3: ['b', 'd'], 4: ['a'], 5: ['e'], 6: ['f']}
>>> [(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'])]
我不知道如何创建最终列表。python是如何做到这一点的?任何想法都将不胜感激。多谢各位


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

我认为最好的解决方案是从int->list创建一个字典。检查原始列表,如果int是一个键,那么只需将其添加到其列表中,否则创建一个带有其值的列表并将其添加到字典中

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

>>> first = lambda x: x[0]
>>> one_sorted = sorted(one, key=first)
然后您可以根据第一个元素对元素进行分组,如下所示

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'])]
groupby(one_sorted, first)
enumerate(groupby(one_sorted, first), 1)
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'])]
>>> groups = {}
>>> for number, string in one:
...     groups.setdefault(number, []).append(string)
...     
... 
>>> groups
{2: ['c'], 3: ['b', 'd'], 4: ['a'], 5: ['e'], 6: ['f']}
>>> [(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'])]
由于您希望按升序将数字分配给组,因此可以像这样将其包装

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'])]
groupby(one_sorted, first)
enumerate(groupby(one_sorted, first), 1)
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'])]
>>> groups = {}
>>> for number, string in one:
...     groups.setdefault(number, []).append(string)
...     
... 
>>> groups
{2: ['c'], 3: ['b', 'd'], 4: ['a'], 5: ['e'], 6: ['f']}
>>> [(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'])]
然后可以在
for
循环中枚举
的结果,如下所示

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'])]
groupby(one_sorted, first)
enumerate(groupby(one_sorted, first), 1)
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'])]
>>> groups = {}
>>> for number, string in one:
...     groups.setdefault(number, []).append(string)
...     
... 
>>> groups
{2: ['c'], 3: ['b', 'd'], 4: ['a'], 5: ['e'], 6: ['f']}
>>> [(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'])]
现在您只需构建结果列表。你可以这样做

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'])]
groupby(one_sorted, first)
enumerate(groupby(one_sorted, first), 1)
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'])]
>>> groups = {}
>>> for number, string in one:
...     groups.setdefault(number, []).append(string)
...     
... 
>>> groups
{2: ['c'], 3: ['b', 'd'], 4: ['a'], 5: ['e'], 6: ['f']}
>>> [(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'])]
[j[1]for j in group]
实际上迭代分组项并获取第二项,即实际字符串


或者,您可以在字典中对元素进行分组,如下所示

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'])]
groupby(one_sorted, first)
enumerate(groupby(one_sorted, first), 1)
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'])]
>>> groups = {}
>>> for number, string in one:
...     groups.setdefault(number, []).append(string)
...     
... 
>>> groups
{2: ['c'], 3: ['b', 'd'], 4: ['a'], 5: ['e'], 6: ['f']}
>>> [(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'])]
然后返回并在已排序的字典上应用
枚举
,如下所示

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'])]
groupby(one_sorted, first)
enumerate(groupby(one_sorted, first), 1)
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'])]
>>> groups = {}
>>> for number, string in one:
...     groups.setdefault(number, []).append(string)
...     
... 
>>> groups
{2: ['c'], 3: ['b', 'd'], 4: ['a'], 5: ['e'], 6: ['f']}
>>> [(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'])]

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

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)

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

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

订单对你来说重要吗?那么什么是
g1
g2
…?是啊,这让我很困惑。我应该点菜单。g1,g2,g3只是一个具有增量值的字符串。谢谢你的帮助。
2、['a']
5、['f']
是从哪里来的?那是我的错,我是说(g1,2,['c'])和(g5,6,['f'])。编辑。[(索引,项目,[j[1]表示组中的j])表示枚举中的索引(项目,组)(groupby(一个排序,第一个),1)],这是一个很有魅力的工作。但是我不明白,你像专业人士一样构建了这个列表,哈哈。谢谢。嗨,很抱歉这将是OOT,但我想知道如果我们不对第一个列表排序,该怎么做?我是说,我们只是把名单“分组”。这怎么可能呢?答应了,我打印了列表并给我错误“”。感谢you@SonicMaster这不是一个错误。它正在打印枚举器对象引用。但是,如果您需要一个列表,我已经更新了答案,以显示如何转换为正常列表。