[英]Python - dividing a list-of-lists to groups
考慮以下簡化案例:
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和內存+速度有效的方法將這個列表列表轉換為基於前兩個參數的列表列表列表:
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]]}
列表:
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
)。
如果字典是可接受的,則此代碼將創建一個:
import collections
d = collections.defaultdict(list)
for name, surname, *stuff in lol:
d[name, surname].append(nums)
請注意,這需要Python 3( 擴展的可迭代解包 )。 對於Python 2,請使用
for x in lol:
name = x[0]
surname = x[1]
stuff = x[2:]
您可以折疊變量以保存線條。
用Python 2等價物來補充delnan的答案:
from collections import defaultdict
dolol=defaultdict(list)
for data in lol:
dolol[data[0],data[1]].append(data[2:])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.