Python将列表划分为组

2024-09-27 21:25:06 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下简化情况:

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列表转换效率会是什么

^{pr2}$

实际上,任何其他的数据结构也可以,只要我有正确的层次结构。例如,我想到了下面的字典结构,但是创建它似乎不够高效,而且内存可能比lolo解决方案高。在

dolol = {('John','Polak'):[[5,3,7,9],[7,9,2,3]],
         ('Mark','Eden') :[[0,3,3,1],[5,1,2,9]]}

Tags: 数据结构列表参数字典层次结构情况pythonicjohn
3条回答

列表:

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

字典:

^{pr2}$

由于itertools.groupby在连续匹配上工作,所以它假定输入排序(lol)。在

为了补充delnan的答案,可以使用一个相当于Python 2的工具:

from collections import defaultdict

dolol=defaultdict(list)
for data in lol:
    dolol[data[0],data[1]].append(data[2:])

如果字典是可接受的,则此代码将创建一个:

import collections
d = collections.defaultdict(list)
for name, surname, *stuff in lol:
    d[name, surname].append(nums)

注意,这需要Python3(extended iterable unpacking)。对于python2,使用

^{pr2}$

您可以折叠变量以保存行。在

相关问题 更多 >

    热门问题