如何在不使用嵌套for循环的情况下将两个列表合并到字典中

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)

  • @cᴏʟᴅsᴘᴇᴇᴅ`d[a] .append(b)`比`d.setdefault(x,[])更清晰.附加(y)` (7认同)
  • 以额外的进口和更重的结构为代价;-) (6认同)
  • 真的,使用`defaultdict`在这里是过度的.请参阅[此答案](/sf/answers/3293912961/),其中`dict.setdefault`可以以最小的开销处理相同的事情. (2认同)

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)


cs9*_*s95 5

没有花哨的结构,只是一本简单的字典.

d = {}
for x, y in zip(a, b):
    d.setdefault(x, []).append(y)
Run Code Online (Sandbox Code Playgroud)