索引数组

2024-04-26 18:09:12 发布

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

我发现自己经常用Python中的平面列表创建索引列表。这是一个非常常见的任务,我想知道是否有一个标准的实用程序,我应该使用它。在

上下文是这样的:给定一个数组,我需要使用一些键来创建较小数组的dict。在

例如:
["Andy","Alice","Bob","Beth","Charlie"]变成
{"A":["Andy","Alice"],"B":["Bob","Beth"],"C":["Charlie"]}

我的解决方案如下:

def make_index(data,key,value=lambda x:x):
    d={}
    for item in data:
        k = key(item)
        v = value(item)
        try: d[k].append(v)
        except KeyError: d[k]=[v]
    return d

这很简单,但我是不是在重新发明一些在其他地方实施得更好的东西呢?在


Tags: key实用程序列表data标准value数组item
2条回答

您可以用^{}来做同样的事情:

from collections import defaultdict

def make_index(data,key,value=lambda x:x):
    d=defaultdict(list)
    for item in data:
        d[key(item)].append(value(item))
    return d

使用defaultdict比使用.setdefault()快,后者是另一个选择。在

不知道为什么itertools答案被删除,但我自己正在写一个:

from itertools import groupby
def make_index(data, key = lambda x: x[0]):
    return {key: list(gr) for key, gr in 
        groupby(sorted(data, key=key), key=key)}

In [3]: make_index(["Andy","Alice","Bob","Beth","Charlie"])
Out[3]: {'A': ['Andy', 'Alice'], 'B': ['Bob', 'Beth'], 'C': ['Charlie']}

In [4]: make_index(["Andy","Alice","Bob","Beth","Charlie"], key=lambda x: len(x))
Out[4]: {3: ['Bob'], 4: ['Andy', 'Beth'], 5: ['Alice'], 7: ['Charlie']}

相关问题 更多 >