【问题标题】:Python How to Decompress a dictionaryPython如何解压字典
【发布时间】:2018-09-04 06:05:27
【问题描述】:

我有一本字典:

inds = [0,   3,   7,   3,   3,   5, 1]

vals = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]

d = {'inds': inds, 'vals': vals}

print(d) 会得到我:{'inds': [0, 3, 7, 3, 3, 5, 1], 'vals': [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]}

如您所见,inds(keys) 没有排序,有重复,也有缺失:范围是 0 到 7,但只有 0,1,3,5,7 个不同的整数。我想编写一个函数来获取字典 (d) 并将其解压缩为一个完整的向量,如下所示。对于任何重复的索引(在这种情况下为 3),我想对相应的值求和,而对于缺失的索引,我想要 0.0。

# ind:  0    1    2    3*    4    5    6    7
x == [1.0, 7.0, 0.0, 11.0, 0.0, 6.0, 0.0, 3.0]

试图编写一个返回最终列表的函数......像这样:

def decompressor (d, n=None):
    final_list=[]
    for i in final_list:
        final_list.append()
    return(final_list)

# final_list.index:  0    1    2    3*    4    5    6    7
# final_list = [1.0, 7.0, 0.0, 11.0, 0.0, 6.0, 0.0, 3.0]

【问题讨论】:

  • 分享您的错误代码。
  • 您的问题陈述不是很清楚,请您详细说明您的示例代码!?
  • @SadiaArif 添加了更多上下文
  • 神秘问题得到神秘的答案:[d.get(i, 0) for d in [{k:sum(v for _, v in g) for k, g in groupby(sorted(zip(inds, vals)), lambda x:x[0])}] for i in range(max(d))] 并确保首先from itertools import groupby...
  • @juanpa.arrivillaga - 总比没有好,谢谢。我试过这个,但这只会让我得到 [1.0, 7.0, 0, 5.0, 0, 6.0, 0],而不是 [1.0, 7.0, 0.0, 11.0, 0.0, 6.0, 0.0, 3.0]

标签: python python-3.x dictionary


【解决方案1】:

试试看,

xyz = [0.0 for x in range(max(inds)+1)]
for i in range(max(inds)):
    if xyz[inds[i]] != 0.0:
        xyz[inds[i]] += vals[i]
    else:
        xyz[inds[i]] = vals[i]

【讨论】:

    【解决方案2】:

    有些事情我仍然不清楚,但假设您正在尝试制作一个列表,其中最大索引是您可以在 inds 列表中找到的那个,并且您想要一个列表,因此您可以执行类似这样的操作:

    inds = [0,   3,   7,   3,   3,   5, 1]
    vals = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
    #initialize a list of zeroes with lenght max index
    res=[float(0)]*(max(inds)+1)
    #[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    
    #Loop indexes and values in pairs
    for i, v in zip(inds, vals):
        #Add the value to the corresponding index
        res[i] += v
    print (res)
    #[1.0, 7.0, 0.0, 11.0, 0.0, 6.0, 0.0, 3.0]
    

    【讨论】:

      【解决方案3】:

      inds = [0, 3, 7, 3, 3, 5, 1]

      vals = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]

      首先你必须初始化字典,从 inds 列表中的最小值到最大值

          max_id = max(inds)
          min_id = min(inds)
          my_dict={}
          i = min_id
          while i <= max_id:
              my_dict[i] = 0.0
              i = i+1
          for i in range(len(inds)):
              my_dict[inds[i]] += vals[i]
      

      my_dict = {0: 1.0, 1: 7.0, 2: 0, 3: 11.0, 4: 0, 5: 6.0, 6: 0, 7: 3.0}

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 2020-03-15
        • 2021-11-15
        • 2020-10-06
        • 1970-01-01
        • 2018-11-11
        • 2021-02-13
        • 1970-01-01
        • 2018-11-03
        相关资源
        最近更新 更多