当我尝试将列表列表转换为列表字典时,我的一个python脚本遇到了问题。
这就是我所拥有的:ID号列表的列表。
a = [ [0,1,2,5] , [4,5] , [0,4] , [2,5] ]
我需要将其转换为列表字典,其中的键对应于每个ID号,值是在先前列表列表中使用键找到的ID号列表。 那应该是:
b = { 0 : [1,2,5,4] , 1 : [0,2,5] , 2 : [0,1,5] , 4 : [0,5] , 5 : [0,1,2,4] }
我最初的列表(a)列表由7万个列表组成,每个列表包含2至5000个ID号(总共约50,000个不同的ID号)。
我想出了一个非常讨厌的代码(大量的for循环),大约需要300万才能执行此转换。 有人会建议以有效(即快速)的方式进行此操作吗?可能有一个我不知道的python库。
谢谢
答案 0 :(得分:1)
我想不出比这更快的方法:
from collections import defaultdict
b = defaultdict(set)
for subl in a:
for el in subl:
for other_el in subl:
if other_el != el:
b[el].add(other_el)
最终将集合作为dict值,但是如果需要列表,则很容易做到:
b = { k: list(v) for k, v in b.items() }
答案 1 :(得分:1)
有一种 可以在一个“行”中实现:
b = {
key: list({
val
for relevant in (candidate for candidate in a if key in candidate)
for val in relevant
if key != val
}) for sublist in a for key in sublist
}
但是使用嵌套循环的解决方案实际上可能会更快。
这里有奇怪的list({...})
构造,以确保每个列表仅列出一次元素(首先将它们收集在一组中)。