【问题标题】:Accessing elements of a list within a dictionary component wise明智地访问字典组件中列表的元素
【发布时间】:2020-06-24 03:30:49
【问题描述】:

假设我有一个字典(MxN = 4x3 矩阵),其中包含整数键和列表值,如下所示:

d={1:[10,11,12], 2:[13,14,15], 3:[16,17,18], 4:[19,20,21]}

我正在尝试获取如下所示的列表:

new_list_1 = [10,13,16,19]

在这种情况下,我试图获取字典中每个值(列表)的第一个元素并将其放入一个新列表中。但是,我也想对其他索引执行此操作,例如:

new_list_2 = [11,14,17,20]

new_list_3 = [12,15,18,21]

一旦我有了这些列表,理想情况下我想把它们放在一个维度为 NxM 的新字典中:

d_new = {0:new_list_1, 1:new_list_2, 2:new_list_3}

谢谢!

【问题讨论】:

  • 也许将其转换为numpy.arraypandas.DataFrame,然后您可以获得第一列array[:,0],第二列array[:,1],等等。您甚至可以将所有列转换为行 - 转置矩阵- d_new = array.T
  • 感谢您的输入 - 这类似于 Trace Malloc 的方法。我喜欢出于可读性目的而采用转置的想法。

标签: python list dictionary indexing


【解决方案1】:

你可以使用

new_list_1 = [v[0] for v in d.values()]
new_list_2 = [v[1] for v in d.values()]
new_list_3 = [v[2] for v in d.values()]

然后使用

d_new = {0:new_list_1, 1:new_list_2, 2:new_list_3}

d_new 的值:

{0: [10, 13, 16, 19], 1: [11, 14, 17, 20], 2: [12, 15, 18, 21]}

或者:

d_new = {i:[v[i] for v in d.values()] for i in range(0,3)}

也会这样做

【讨论】:

  • 什么是n0n1n2?它们没有定义。也希望循环遍历键而不是手动创建列表。
  • @超越其v[0]v[1]v[2]
  • @Transcending 我还附上了一个可以在没有多个列表的情况下完成的衬垫
  • 谢谢 - 理想情况下,如果字典具有更高的维度,我希望 range(0,3) 部分的硬编码更少。
  • @Transcending 更高维度使用 range(0,N) 在当前情况下 MxN N 是 3
【解决方案2】:

将您的 dict 值转换为列表列表(二维矩阵),然后使用该矩阵的转置,然后根据您的需要生成结果。

res =  {i: list(k) for i ,k in enumerate(list(zip(*d.values())))} 
print(res)
# {0: [10, 13, 16, 19], 1: [11, 14, 17, 20], 2: [12, 15, 18, 21]}                                                                                                                               

【讨论】:

    【解决方案3】:

    使用 numpy 你可以:

    import numpy as np
    d = {
        1: [10, 11, 12],
        2: [13, 14, 15],
        3: [16, 17, 18],
        4: [19, 20, 21],
    }
    a = np.array(list(d.values()))
    a = a.T
    

    输出:

    array([[10, 13, 16, 19],
           [11, 14, 17, 20],
           [12, 15, 18, 21]])
    

    返回字典:

    d = {n+1: l for n, l in enumerate(a.tolist())}
    

    输出:

    {1: [10, 13, 16, 19], 2: [11, 14, 17, 20], 3: [12, 15, 18, 21]}
    

    【讨论】:

    • 好电话!我的大脑如此煎熬,我什至没有意识到我在寻找转置。这似乎也很有效。
    • @TranscendingThanks....也将转换添加回字典。
    【解决方案4】:

    你也可以使用 pandas:

    import pandas as pd
    
    d_new = pd.DataFrame.from_dict(d, orient = 'index').to_dict('list')
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢,我真的很喜欢这个解决方案的简单性和可读性。
    【解决方案5】:

    你可以这样做:

    d_new = {}
    for i in range(len(list(d.values())[0])):
        d_new[i] = [x[i] for x in d.values()]
    

    希望对你有帮助:)

    【讨论】:

      【解决方案6】:

      简单易懂:

      d={1:[10,11,12], 2:[13,14,15], 3:[16,17,18], 4:[19,20,21]}
      d_new = {}
      for i in range(len(d[1])):
          l = []
          for v in d.values():
              l.append(v[i])
          d_new[i] = l
      print(d_new)
      

      输出:

      {0: [10, 13, 16, 19], 1: [11, 14, 17, 20], 2: [12, 15, 18, 21]}
      

      【讨论】:

        【解决方案7】:

        代码:

        lista_1 = []
        lista_2 = []
        lista_3 = []
        d_new = {}
        for i in d.values():
          for h, j in enumerate(i):
            if h == 0:
              lista_1.append(j)
              d_new[h] = lista_1
            elif h == 1:
              lista_2.append(j)
              d_new[h] = lista_2
            else:
              lista_3.append(j)
              d_new[h] = lista_3
        

        输出:

        {0: [10, 13, 16, 19], 1: [11, 14, 17, 20], 2: [12, 15, 18, 21]}
        

        也许这对你有帮助,它是为了初学者的理解!

        【讨论】:

          猜你喜欢
          • 2018-05-13
          • 2023-04-06
          • 2021-07-27
          • 2019-02-13
          • 1970-01-01
          • 2018-08-30
          • 2022-10-04
          • 2020-03-11
          • 2019-10-22
          相关资源
          最近更新 更多