Python 为数组编制索引

Python 为数组编制索引,python,Python,我发现自己经常在Python中从平面列表创建索引列表。这是一个非常常见的任务,我想知道是否有一个标准的实用程序,我应该使用它 上下文是这样的:给定一个数组,我需要使用一些用于分组的键创建一个较小数组的dict e、 g: [“安迪”、“爱丽丝”、“鲍勃”、“贝丝”、“查理”]变成了 {“A”:[“安迪”、“爱丽丝”],“B”:[“鲍勃”、“贝丝”],“C”:[“查理”} 我的解决方案如下所示: def make_index(data,key,value=lambda x:x): d={}

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

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

e、 g:
[“安迪”、“爱丽丝”、“鲍勃”、“贝丝”、“查理”]
变成了
{“A”:[“安迪”、“爱丽丝”],“B”:[“鲍勃”、“贝丝”],“C”:[“查理”}

我的解决方案如下所示:

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

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

你可以用一个:


使用
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']}

这当然是一个更有趣的答案,但它所花费的时间似乎是Martijn版本的两倍,可能是因为它是多步变换。@tylerl是的,Martjijn的版本不需要对列表进行排序。@JoranBeasley:你所做的排序扼杀了它。
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']}