按键分组列表的Pythonic方法

按键分组列表的Pythonic方法,python,list-comprehension,Python,List Comprehension,我有一个如下列表: [ [1, "a", 319], [1, "b", 991], [2, "Cd", 19], [3, "88x", 2891], [3, "foo", 11] ] 将此转化为以下内容的最“python”方式是什么: [ [1, [["a", 319], ["b", 991]]], [2, [["Cd", 19]]], [3, [["88x", 2891], ["foo", 11]]] ] 我知道如何使用进行循环之类的操作,但我希望采用更简洁

我有一个如下列表:

[
  [1, "a", 319],
  [1, "b", 991],
  [2, "Cd", 19],
  [3, "88x", 2891],
  [3, "foo", 11]
]
将此转化为以下内容的最“python”方式是什么:

[
  [1, [["a", 319], ["b", 991]]],
  [2, [["Cd", 19]]],
  [3, [["88x", 2891], ["foo", 11]]]
]

我知道如何使用
进行
循环之类的操作,但我希望采用更简洁的方法。

这里有一个选项,假设列表按前面的第一个元素排序:

from itertools import groupby    
[[k, [x[1:] for x in g]] for k, g in groupby(lst, key = lambda x: x[0])]

#[[1, [['a', 319], ['b', 991]]],
# [2, [['Cd', 19]]],
# [3, [['88x', 2891], ['foo', 11]]]]

这里有一个选项,假设列表按前面的第一个元素排序:

from itertools import groupby    
[[k, [x[1:] for x in g]] for k, g in groupby(lst, key = lambda x: x[0])]

#[[1, [['a', 319], ['b', 991]]],
# [2, [['Cd', 19]]],
# [3, [['88x', 2891], ['foo', 11]]]]

如果您不介意类似字典的对象,也可以使用
collections.defaultdict

>>> l = [
...   [1, "a", 319],
...   [1, "b", 991],
...   [2, "Cd", 19],
...   [3, "88x", 2891],
...   [3, "foo", 11]
... ]
>>> import collections
>>> d = collections.defaultdict(list)
>>> for k, *v in l:
...     d[k].append(v)
...
>>> import pprint
>>> pprint.pprint(d)
{1: [['a', 319], ['b', 991]],
 2: [['Cd', 19]],
 3: [['88x', 2891], ['foo', 11]]}

如果您不介意类似字典的对象,也可以使用
collections.defaultdict

>>> l = [
...   [1, "a", 319],
...   [1, "b", 991],
...   [2, "Cd", 19],
...   [3, "88x", 2891],
...   [3, "foo", 11]
... ]
>>> import collections
>>> d = collections.defaultdict(list)
>>> for k, *v in l:
...     d[k].append(v)
...
>>> import pprint
>>> pprint.pprint(d)
{1: [['a', 319], ['b', 991]],
 2: [['Cd', 19]],
 3: [['88x', 2891], ['foo', 11]]}

我想你想要
groupby
:一个
集合。DefaultDict
可能更容易。我想你想要
groupby
:一个
集合。DefaultDict
可能更容易。这很有效。在我的例子中,对列表进行排序是可能的,因为它来自数据库SQL查询。在我的例子中,可以对列表进行排序,因为它来自数据库SQL查询。