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