我有一个嵌套的配对数据列表,格式为:
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']]
因此,对于我的项目列表,如果项目在列表中以不同的值重复多次,则所有值都应与其对应的项目分组。
非常感谢任何帮助。
由于
答案 0 :(得分: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
之后? ),你已经失去了。如果这很重要,您可以使用OrderedDict
。
最大的好处通常是,你实际上最终想要一本字典而不是列表。
较小的好处是,如果您的数据未排序,groupby(…sorted(…))
需要O(NlogN)排序,而此解决方案是O(N)。通常情况下,这不会产生任何影响。如果确实如此,那么给定的Python实现和平台的恒定因子差异可能会超过差异。但如果性能很重要,请测试两种解决方案并使用更快的解决方案。
答案 1 :(得分: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']]