Big*_*igD 18 python dictionary list
我有两个清单:
a = [0, 0, 0, 1, 1, 1, 1, 1, .... 99999]
b = [24, 53, 88, 32, 45, 24, 88, 53, ...... 1]
Run Code Online (Sandbox Code Playgroud)
我想将这两个列表合并到一个字典中,如:
{
0: [24, 53, 88],
1: [32, 45, 24, 88, 53],
......
99999: [1]
}
Run Code Online (Sandbox Code Playgroud)
一个解决方案可能是使用for循环,它看起来不太优雅,如:
d = {}
unique_a = list(set(list_a))
for i in range(len(list_a)):
if list_a[i] in d.keys:
d[list_a[i]].append(list_b[i])
else:
d[list_a] = [list_b[i]]
Run Code Online (Sandbox Code Playgroud)
虽然这确实有效,但它效率很低,而且当列表非常大时会占用太多时间.我想知道更优雅的方法来构建这样的字典吗?
提前致谢!
Aja*_*234 33
您可以使用defaultdict:
from collections import defaultdict
d = defaultdict(list)
list_a = [0, 0, 0, 1, 1, 1, 1, 1, 9999]
list_b = [24, 53, 88, 32, 45, 24, 88, 53, 1]
for a, b in zip(list_a, list_b):
d[a].append(b)
print(dict(d))
Run Code Online (Sandbox Code Playgroud)
输出:
{0: [24, 53, 88], 1: [32, 45, 24, 88, 53], 9999: [1]}
Run Code Online (Sandbox Code Playgroud)
Rom*_*est 14
替代itertools.groupby()方案:
import itertools
a = [0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3]
b = [24, 53, 88, 32, 45, 24, 88, 53, 11, 22, 33, 44, 55, 66, 77]
result = { k: [i[1] for i in g]
for k,g in itertools.groupby(sorted(zip(a, b)), key=lambda x:x[0]) }
print(result)
Run Code Online (Sandbox Code Playgroud)
输出:
{0: [24, 53, 88], 1: [24, 32, 45, 53, 88], 2: [11, 22, 33, 44, 55, 66], 3: [77]}
Run Code Online (Sandbox Code Playgroud)
没有花哨的结构,只是一本简单的字典.
d = {}
for x, y in zip(a, b):
d.setdefault(x, []).append(y)
Run Code Online (Sandbox Code Playgroud)