python3:将列表列表转换为列表字典

时间:2018-08-20 09:40:19

标签: python-3.x list dictionary

当我尝试将列表列表转换为列表字典时,我的一个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库。

谢谢

2 个答案:

答案 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({...})构造,以确保每个列表仅列出一次元素(首先将它们收集在一组中)。