【问题标题】:how to make small chunks of python dictionary如何制作小块python字典
【发布时间】:2022-01-10 21:59:34
【问题描述】:

嗨,我有这样的 python 子字典

import torch
import torch.nn as nn
dic = {
  "A": [0.2822, -0.0958, -0.5165, -0.3812, 
        -0.3469,  0.4025, -0.0696, -0.1246,
        -0.1132,  0.4170, -0.0383, -0.4071, 
        -0.5407,  0.1519,  0.5630,  0.1276],
  "B": [1.0014, 0.9980, 1.0012, 0.9986, 
       1.0001, 0.9999, 1.0016, 1.0014, 
       1.0008, 0.9996, 1.0008, 1.0004, 
       1.0000, 0.9987, 0.9997, 0.9989]
}

对于键 1,我有 16 个值,我想为键 A 制作 2 个大小为 8 的块。这怎么可能?

就像前 8 个值存储在单独的数组中,最后 8 个值存储在单独的数组或字典中及其键值。 如图所示

【问题讨论】:

  • 目前尚不清楚您是否只想处理 A 而不是 B 或全部以及是否要保留原始密钥。请以文本形式提供完整的预期输出。

标签: python dictionary pytorch


【解决方案1】:

试试这样的:

for key in dic:
    dic[key + "1"] = dic[key][:8] # Create A1 (or B1)
    dic[key + "2"] = dic[key][8:] # Create A2 (or B2)
    del dic[key] # Remove A (or B)

【讨论】:

    【解决方案2】:

    首先,我将键称为键(即键“A”有 16 个值,而不是键 1)。将字典视为无序且只是一组键值对是一种很好的做法。

    其次,使用 numpy 将允许我们将我们想要的密钥分成两个(或更多)偶数组。如果您最终需要将包含 30 个元素的列表拆分为三个列表,则此代码仍然可以使用。

    import numpy as np
    
    dic = {
      "A": [0.2822, -0.0958, -0.5165, -0.3812,
            -0.3469,  0.4025, -0.0696, -0.1246,
            -0.1132,  0.4170, -0.0383, -0.4071,
            -0.5407,  0.1519,  0.5630,  0.1276],
      "B": [1.0014, 0.9980, 1.0012, 0.9986,
           1.0001, 0.9999, 1.0016, 1.0014,
           1.0008, 0.9996, 1.0008, 1.0004,
           1.0000, 0.9987, 0.9997, 0.9989]
    }
    
    # We give array_split() our list, and how many we want it split into.
    a1, a2 = np.array_split(dic['A'], 2) # We get our two lists returned.
    dic['A1'] = a1.tolist() # Numpy returns it as an np.array, so let's put it back into a list.
    dic['A2'] = a2.tolist()
    del(dic['A']) # Remove the now unused key-value.
    
    {'B': [1.0014, 0.998, 1.0012, 0.9986, 1.0001, 0.9999, 1.0016, 1.0014, 1.0008, 0.9996, 1.0008, 1.0004, 1.0, 0.9987, 0.9997, 0.9989],
     'A1': [0.2822, -0.0958, -0.5165, -0.3812, -0.3469, 0.4025, -0.0696, -0.1246],
     'A2': [-0.1132, 0.417, -0.0383, -0.4071, -0.5407, 0.1519, 0.563, 0.1276]}
    

    【讨论】:

      【解决方案3】:

      这有点像你要找的东西吗?

      >>> dic["A1"]=dic["A"][:8]
      >>> dic["A2"]=dic["A"][8:]
      >>> dic["A2"]
      [-0.1132, 0.417, -0.0383, -0.4071, -0.5407, 0.1519, 0.563, 0.1276]
      >>> dic["A1"]
      [0.2822, -0.0958, -0.5165, -0.3812, -0.3469, 0.4025, -0.0696, -0.1246]
      >>> dic
      {'A': [0.2822, -0.0958, -0.5165, -0.3812, -0.3469, 0.4025, -0.0696, -0.1246, -0.1132, 0.417, -0.0383, -0.4071, -0.5407, 0.1519, 0.563, 0.1276], 'B': [1.0014, 0.998, 1.0012, 0.9986, 1.0001, 0.9999, 1.0016, 1.0014, 1.0008, 0.9996, 1.0008, 1.0004, 1.0, 0.9987, 0.9997, 0.9989], 'A1': [0.2822, -0.0958, -0.5165, -0.3812, -0.3469, 0.4025, -0.0696, -0.1246], 'A2': [-0.1132, 0.417, -0.0383, -0.4071, -0.5407, 0.1519, 0.563, 0.1276]}
      >>> 
      

      【讨论】:

        【解决方案4】:

        您可以通过将每个列表分成两个新键来创建一个新字典:

        from collections import ChainMap
        
        d = {
          'a': [0.2822, -0.0958, -0.5165, -0.3812, 
                -0.3469,  0.4025, -0.0696, -0.1246,
                -0.1132,  0.4170, -0.0383, -0.4071, 
                -0.5407,  0.1519,  0.5630,  0.1276],
          'b': [1.0014, 0.9980, 1.0012, 0.9986, 
                1.0001, 0.9999, 1.0016, 1.0014, 
                1.0008, 0.9996, 1.0008, 1.0004, 
                1.0000, 0.9987, 0.9997, 0.9989]
        }
        
        new_d = dict(ChainMap(
            *[{f'{k}1': v[:len(v)//2], f'{k}2': v[len(v)//2:]} for k, v in d.items()]
        ))
        print(new_d)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-28
          • 2016-06-09
          • 1970-01-01
          • 1970-01-01
          • 2011-01-27
          • 2015-04-25
          • 2020-11-25
          相关资源
          最近更新 更多