我有一个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的值,这就是我想要的。
谢谢!
答案 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]}