如何使用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','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','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','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','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','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

是否有任何更简单的方法来做到这一点,以便我可以一次重命名可能的键?

解决方法

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

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','p_values': 0.04813691453106806,'percent_missing_in_group_1': 0.09896233666410453,'percent_missing_in_
group_2': 0.10215470469694621}
>>>

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

,

我可以给你两种方法来解决这个问题:

方法一:修改原始数据的键值

data = [{'name': 'Achieving_Results_in_a_Challenging_Business_Context_rank = 1.0',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','percent_in_group':[0.09896233666410453,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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...