我有一个嵌套的成对数据列表,格式如下:
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']]
因此对于我的项目列表,如果项目在列表中以不同的值重复多次,则所有值都应与其对应的项目分组。
如有任何帮助,我们将不胜感激。
谢谢
请您参考如下方法:
让我们从使用字典开始,将项目映射到值列表。这将比列表更容易(也更快),因为要确定将新值添加到哪个列表只是 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 实现和平台的常数因子差异可能无论如何都会超过差异。但如果性能很重要,请测试这两种解决方案并使用更快的解决方案。
