Python:嵌套列表修改

时间:2013-05-02 22:58:53

标签: python nested-lists

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

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']]

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

非常感谢任何帮助。

由于

2 个答案:

答案 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']]