簡體   English   中英

如何在 Python 中的字典列表中使用另一個鍵列表中的值在字典中創建一個新鍵?

[英]How to create a new key in dictionary with value from another key list from a list of dictionary in Python?

我有這個列表,其中包含 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

有沒有更簡單和更容易的方法來做到這一點,以便我可以一次重命名可能的鍵?

您可以嘗試使用 function 來處理列表中的每個元素(或字典)並將其返回。 然后,生成一個新列表或迭代您的列表並編輯列表中的每個元素。 您必須刪除字典中不再需要的鍵。

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]

或者,如果您認為它會導致 memory 錯誤,您可以在列表中進行迭代。

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}
>>>

不:可能有更快的方法,但這應該有效!

我可以給你兩種方法來處理這個問題:

方法一:改變原始數據的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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM