Python-将列表列表划分为组
考虑以下简化情况:Python-将列表列表划分为组,python,list,performance,memory-efficient,Python,List,Performance,Memory Efficient,考虑以下简化情况: lol = [['John','Polak',5,3,7,9], ['John','Polak',7,9,2,3], ['Mark','Eden' ,0,3,3,1], ['Mark','Eden' ,5,1,2,9]] 根据前两个参数将此列表转换为列表列表列表的pythonic and memory+speed efficient方法是什么: lolol = [[['John','Polak',5,3,7,9],
lol = [['John','Polak',5,3,7,9],
['John','Polak',7,9,2,3],
['Mark','Eden' ,0,3,3,1],
['Mark','Eden' ,5,1,2,9]]
根据前两个参数将此列表转换为列表列表列表的pythonic and memory+speed efficient方法是什么:
lolol = [[['John','Polak',5,3,7,9],
['John','Polak',7,9,2,3]],
[['Mark','Eden' ,0,3,3,1],
['Mark','Eden' ,5,1,2,9]]]
实际上,只要我有正确的层次结构,任何其他数据结构都可以。例如,我想到了下面的字典结构,但是创建它似乎效率不够,而且内存可能比lolol解决方案要高
dolol = {('John','Polak'):[[5,3,7,9],[7,9,2,3]],
('Mark','Eden') :[[0,3,3,1],[5,1,2,9]]}
如果字典是可接受的,此代码将创建一个:
import collections
d = collections.defaultdict(list)
for name, surname, *stuff in lol:
d[name, surname].append(nums)
注意,这需要Python3()。对于Python2,使用
for x in lol:
name = x[0]
surname = x[1]
stuff = x[2:]
您可以折叠变量以保存行。列表:
from itertools import groupby
lolol = [list(grp) for (match, grp) in groupby(lol, lambda lst: lst[:2])]
# [[['John', 'Polak', 5, 3, 7, 9], ['John', 'Polak', 7, 9, 2, 3]],
# [['Mark', 'Eden', 0, 3, 3, 1], ['Mark', 'Eden', 5, 1, 2, 9]]]
字典:
dolol = dict((tuple(match), [x[2:] for x in grp]) for (match, grp) in
groupby(lol, lambda lst: lst[:2]))
# {('John', 'Polak'): [[5, 3, 7, 9], [7, 9, 2, 3]],
# ('Mark', 'Eden'): [[0, 3, 3, 1], [5, 1, 2, 9]]}
由于
itertools.groupby
在连续匹配上工作,因此它假定已排序的输入(lol
) 用Python2的等价物来补充delnan的答案:
from collections import defaultdict
dolol=defaultdict(list)
for data in lol:
dolol[data[0],data[1]].append(data[2:])
输入列表总是按键排序,还是按混合顺序排序?dict的效率如何?也就是说,你想如何处理这些数据(这会使dicts效率低下)?@Jesse-是的,这些密钥是经过先验排序的,这绝对是我的需要。尽管出于好奇,我也不介意知道另一种情况。@Jonathan:dict确实需要更多的内存,但如果你要在其中搜索某些内容,则不会花费更多的时间。考虑到你的数据在这种情况下可能更有意义,你可以考虑使用类。要保持内存效率,请使用内置的
\uuuu插槽。