假设我有两个由另一个函数生成的列表:
test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]]
test2 = [[1, 4], [4, 1]]我希望将它们转换为关联数组,以便快速查找,如下所示:
test: {0: [1, 2], 1: [5,6], 2: [0], 3: [99, 98, 97]}
test2: {1: [4], 4: [1]}我可以这样做:
def list_to_dict(my_list):
last_val = my_list[0][0]
temp = []
my_dict = {}
for i in my_list:
if last_val == i[0]:
temp.append(i[1])
else:
#add the values to this key
my_dict[last_val] = temp
#reset the list
temp = []
temp.append(i[1])
last_val = i[0]
my_dict[last_val] = temp
return my_dict但是,这并不是毕达通。有没有更多的毕达通的方法来实现这一点?
发布于 2016-05-26 11:10:18
>>> test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]]
>>>
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>>
>>> for i, j in test:
... d[i].append(j)
...
>>> d
defaultdict(<type 'list'>, {0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]})发布于 2016-05-26 11:58:20
您也可以通过字典分组来实现这一点,如下所示:
def list_to_dict(my_list):
d = {}
for pair in my_list:
first = pair[0]
second = pair[1]
if first not in d:
d[first] = []
d[first].append(second)
return d如果键不可用,也可以使用setdefault():
def list_to_dict(my_list):
d = {}
for pair in my_list:
d.setdefault(pair[0], []).append(pair[1])
return d
# Output
{0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]}如果您愿意,可以很容易地将这些操作操作为使用defaultdict。
发布于 2016-05-26 11:49:39
这似乎是itertools.groupby的完美用例。
test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]]
import itertools
d = {k:[t[1] for t in g] for k,g in itertools.groupby(test, key=lambda t: t[0])}
print(d)注意,groupby工作在可迭代项上,默认情况下它返回一个grouper对象。结果如下:
{0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]}https://stackoverflow.com/questions/37459042
复制相似问题