【问题标题】:How to create a new key in dictionary with value from another key list from a list of dictionary in Python?如何在字典中创建一个新键,其值来自 Python 中字典列表中另一个键列表的值?
【发布时间】:2021-07-12 13:59:14
【问题描述】:

我有一个包含 18k 个字典元素的列表(我只显示了其中的一部分),我需要在其中替换一个键并提取列表的一个元素。例如,以下是我的字典列表。

[{'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 1.0',
  'column_index': 387,
  'hypergeometric_p_values': [0.04813691453106806, 0.951863085468932],
  'percent_in_group': [0.09896233666410453,
   0.10215470469694621,
   0.11547714514835605]},
 {'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 10.0',
  'column_index': 387,
  'hypergeometric_p_values': [0.00014612920992348574, 0.9998538707900765],
  'percent_in_group': [0.08647194465795542,
   0.09316385056580376,
   0.1210906174819567]},
 {'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 2.0',
  'column_index': 387,
  'hypergeometric_p_values': [0.044335711647001765, 0.9556642883529982],
  'percent_in_group': [0.09934665641813989,
   0.10261974887614324,
   0.11627906976744186]},
 {'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 3.0',
  'column_index': 387,
  'hypergeometric_p_values': [0.000497701807800938, 0.999502298192199],
  'percent_in_group': [0.08724058416602613,
   0.09331886529220276,
   0.11868484362469928]},
 {'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 4.0',
  'column_index': 387,
  'hypergeometric_p_values': [0.07220994726016502, 0.927790052739835],
  'percent_in_group': [0.08954650269023828,
   0.0922337622074097,
   0.10344827586206896]}]

我需要将hypergeometric_p_values 更改为简单的p_values,并且只从值列表中获取第一个元素。另外,我需要使用列表中的元素 0 和 1 创建一个新的键名 percent_missing_group_1percent_missing_group_2

所以,数据应该是这样的(对于单个字典):

[{'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 1.0',
  'column_index': 387,
  'p_values': 0.04813691453106806,
  'percent_missing_in_group_1': 0.09896233666410453,
  'percent_missing_in_group_2': 0.10215470469694621
}]

但我已经坚持了一段时间,尝试了很多不同的方法,但都失败了。以下一个有效,但仅用于重命名密钥

data = [{"p_value" if k == 'hypergeometric_p_values' else k:v for k,v in d.items()} for d in data]

另外,当我尝试按以下方式进行操作时:

for item in cat: 
    for k,v in item.items():
        if k == 'hypergeometric_p_values': 
            item['p_value'] = v[0]
            del item['hypergeometric_p_values']

    print(item)

我收到以下错误:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-397-5298b96a56bc> in <module>
     10 
     11 for item in cat:
---> 12     for k,v in item.items():
     13         if k == 'hypergeometric_p_values':
     14             item['p_value'] = v[0]

RuntimeError: dictionary keys changed during iteration

有没有更简单的方法可以让我一次重命名多个键?

【问题讨论】:

    标签: python dictionary list-comprehension


    【解决方案1】:

    您可以尝试一个函数来处理列表中的每个元素(或字典)并将其返回。然后,生成一个新列表或迭代您的列表并编辑列表中的每个元素。您必须删除字典中不再需要的键。

    my_list = [{'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 1.0',
      'column_index': 387,
      'hypergeometric_p_values': [0.04813691453106806, 0.951863085468932],
      'percent_in_group': [0.09896233666410453,
       0.10215470469694621,
       0.11547714514835605]},...]
    
    def get_elem(elem):
        elem["p_values"] = elem["hypergeometric_p_values"][0]
        elem["percent_missing_in_group_1"] = elem['percent_in_group'][0]
        elem["percent_missing_in_group_2"] = elem['percent_in_group'][1]
        del elem["hypergeometric_p_values"]
        del elem["percent_in_group"]
        return elem
    
    my_list = [get_elem(x) for x in my_list]
    

    或者如果你认为它会导致内存错误,你可以迭代你的列表。

    for i in range(len(my_list)):
        my_list[i] = get_elem(my_list[i])
    
    >>> my_list[0]
    {'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 1.0', 'column_index': 387, 'p_values': 0.04813691453106806, 'percent_missing_in_group_1': 0.09896233666410453, 'percent_missing_in_
    group_2': 0.10215470469694621}
    >>>
    

    不是:可能有更快的方法,但这应该可行!

    【讨论】:

      【解决方案2】:

      我可以给你2个方法来处理这个问题:

      方法一:改变原始数据的key和value

      data = [{'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 1.0',
        'column_index': 387,
        'hypergeometric_p_values': [0.04813691453106806, 0.951863085468932],
        'percent_in_group': [0.09896233666410453,0.10215470469694621,0.11547714514835605]}]
      for e in data:
          p_values = e['hypergeometric_p_values'][0]
          e['p_values'] = e.pop('hypergeometric_p_values')
          e['p_values'] = p_values
          e['percent_missing_in_group_1'] = e['percent_in_group'][0]
          e['percent_missing_in_group_2'] = e['percent_in_group'][1]
          del e['percent_in_group']
      print(data)
      

      方法二:新建数据列表

      data = [{'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 1.0',
      'column_index': 387,
      'hypergeometric_p_values': [0.04813691453106806, 0.951863085468932],
      'percent_in_group':[0.09896233666410453, 0.10215470469694621,0.11547714514835605]}]
      
      data1 = []
      for e in data:
          d = {}
          d['name'] = e['name']
          d['column_index'] = e['column_index']
          d['p_values'] = e['hypergeometric_p_values'][0]
          d['percent_missing_in_group_1'] = e['percent_in_group'][0]
          d['percent_missing_in_group_2'] = e['percent_in_group'][1]
          data1.append(d)
      print(data1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-08
        • 2016-06-15
        • 1970-01-01
        • 2022-06-23
        相关资源
        最近更新 更多