1

我有一个嵌套的配对数据列表,格式如下:

mylist = [['item1', 'some other stuff', 'value1'],['item1', 'some other stuff', 'value2'],['item2', 'some other stuff', 'value3'],['item2', 'some other stuff', 'value4']]

我不知道如何执行以下操作,但我需要:

我需要将列表分组为:

[['item1', 'value1', 'value2'], ['item2', 'value3', 'value4']]

因此,对于我的项目列表,如果项目在列表中以不同的值重复多次,则所有值都应与其对应的项目分组。

任何帮助将不胜感激。

谢谢

4

2 回答 2

4

让我们从使用字典开始,将项目映射到值列表。这将比列表更容易(并且更快),因为要找出将新值添加到哪个列表,mydict[item]而不必编写某种线性搜索函数。

mydict = {}
for item, otherstuff, value in mylist:
    mydict.setdefault(item, []).append(value)

这给了你:

{'item1': ['value1', 'value2'], 'item2': ['value3', 'value4']}

现在,如果您愿意,我们可以将该字典转换回列表:

groupedlist = [[k] + v for k, v in mydict.items()]

这给了你:

[['item2', 'value3', 'value4'], ['item1', 'value1', 'value2']]

这里最大的缺点是,一旦你把东西放进一个字典里,你就会失去任何原来的顺序。如果您期望item1第一个出现,因为它的第一个条目出现在item2的第一个条目之前(或者因为item2' 的最后一个条目出现在item1's 之后?),那么您就输了。如果它很重要,您可以使用OrderedDict.

最大的好处是,你实际上最终想要的是字典,而不是列表。

较小的好处是,如果您的数据未排序,则groupby(…sorted(…))需要 O(NlogN) 排序,而此解决方案是 O(N)。通常,这不会有什么不同。如果确实如此,那么给定 Python 实现和平台的常数因子差异可能会超过差异。但是,如果性能很重要,请测试这两种解决方案并使用更快的一种。

于 2013-05-02T23:07:24.233 回答
2

您可以使用itertools.groupby, 如果列表没有按照第一项排序,那么您可能必须先对其进行排序。意味着这将导致O(NlogN)未排序数据和排序数据的复杂性O(N)

>>> from itertools import groupby
>>> [[k]+[x[-1] for x in v] for k,v in groupby(mylist,key=lambda x:x[0])]
[['item1', 'value1', 'value2'], ['item2', 'value3', 'value4']]

使用defaultdict,它适用于O(N)复杂的已排序和未排序数据。

>>> from collections import defaultdict
>>> dic=defaultdict(list)
>>> for x in mylist:
...     key=x[0]
...     dic[key].append(x[-1])
...     
>>> [[k]+v for k,v in dic.items()]
[['item2', 'value3', 'value4'], ['item1', 'value1', 'value2']]
于 2013-05-02T23:02:26.010 回答