【问题标题】:Get dictionary mapping values to reference ID获取字典映射值到引用 ID
【发布时间】:2018-07-20 16:32:07
【问题描述】:

我有一个 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 的值,这正是我想要的。

谢谢!

【问题讨论】:

  • 53 如何映射到 [6, 2] 而 5 映射到 [6]?你如何确定这一点?
  • @Code-Apprentice 对不起,应该更清楚。所以 53 是 list_list 中的唯一值,它同时出现在 ID 6 和 2 中。但是,作为唯一值的 list_list 5 只出现在第一个 np 数组中,它对应于 ID #6。像这样,对于 list_list 中的每个唯一值,我想查看它显示在哪个对应的 ID 中。
  • 如果我理解正确,list_list[i] 中的所有值都对应于ID[i]。对吗?
  • @Code-Apprentice 是的,这是正确的。
  • 不应该2: [6] 是2: [6, 2],如果我没记错的话(因为2 在两个子列表中)?

标签: python numpy dictionary


【解决方案1】:

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

那么接下来呢?好吧,我们想用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】:

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

    【讨论】:

      猜你喜欢
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 2012-04-16
      • 2011-10-18
      • 2021-08-02
      相关资源
      最近更新 更多