代码之家  ›  专栏  ›  技术社区  ›  Jack Arnestad

获取字典映射值到引用ID

  •  1
  • Jack Arnestad  · 技术社区  · 6 年前

    我有一个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}

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

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

    谢谢!

    2 回复  |  直到 6 年前
        1
  •  2
  •   Code-Apprentice    6 年前

    解决这样一个问题的最好方法是把它分成更小的步骤。用英语和伪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。将问题分解成这样的小步骤是开发程序员技能的关键部分。

        2
  •  1
  •   Vikas NS    6 年前

    我们迭代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]}