获取字典映射值到参考ID

时间:2018-07-20 16:32:07

标签: python numpy dictionary

我有一个numpy数组的列表,如下所示:

list_list = [np.array([53, 5, 2, 5, 5, 2, 1, 5, 9]), np.array([6, 4, 1,2, 53, 23, 1, 4])]

以及上面每个数组的ID列表:

ID = [6, 2]

如何获得一个字典,该字典针对list_list中的每个唯一值,获取包含它的ID的列表?

例如,对于这个非常简单的示例,我想要类似的东西:

{53: [6, 2], 5: [6], 2: [6, 2], 1: [6, 2], etc}

我的实际list_list长于1000个列表,每个numpy数组包含大约1000万个值,因此解决方案的效率是关键。

我知道dict(zip(ID, list_list))会给我一个对应于ID及其所有值的字典,但不会给我对应于ID的值,这就是我想要的。

谢谢!

2 个答案:

答案 0 :(得分:2)

解决此类问题的最佳方法是将其分解为较小的步骤。适当地用英语和伪python组合描述它们。您似乎有开始使用zip(ID, list_list)的正确想法。正如我们在评论中讨论的那样,这将在两个列表之间创建关联。

那接下来呢?好吧,我们想用list_list中的值作为键来构建字典。为此,我们需要遍历zip()返回的列表:

for id, list in zip(ID, list_list):
    pass

然后我们需要遍历list的元素以确定字典的键:

for id, list in zip(ID, list_list):
    for x in list:
        pass

现在我们需要一个空字典来添加内容到

d = {}
for id, list in zip(ID, list_list):
    for x in list:
        pass

接下来,我们需要获取字典的列表(如果存在)。如果不存在,我们可以改用一个空列表。然后将id附加到列表中并将其放入字典中:

d = {}
for id, list in zip(ID, list_list):
    for x in list:
        l = d.get(x, [])
        l.append(id)
        d[x] = l

注意我如何用语言描述每个步骤做什么,然后将其转换为Python。将问题分解成这样的小步骤是开发程序员技能的关键部分。

答案 1 :(得分:1)

我们迭代Zip(ID,list_list)并通过创建一个集合来获取lis中的唯一元素。 然后我们将遍历此集合,如果该元素尚未在字典中完全存在,则将其添加到字典中(如果已经存在),然后附加id。

import numpy as np
list_list = [np.array([53, 5, 2, 5, 5, 2, 1, 5, 9]), np.array([6, 4, 1,2, 53, 23, 1, 4])]
ID = [6, 2]
dic={}
for id,lis in zip(ID,list_list):
    lis=set(lis)
    for ele in lis:
        if ele not in dic:
            dic[ele]=[id]
        else:
            dic[ele].append(id)

print(dic)

{1: [6, 2], 2: [6, 2], 5: [6], 9: [6], 53: [6, 2], 4: [2], 6: [2], 23: [2]}