3

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

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

例如:
["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

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

4

2 回答 2

5

您可以使用 a 更简单地执行相同的操作defaultdict

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

使用 adefaultdict比使用 快.setdefault(),这是另一种选择。

于 2012-09-28T20:09:31.460 回答
3

不知道为什么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']}
于 2012-09-28T20:13:34.530 回答