我有一本字典,其中的键是描述列表的字符串:
initial_dict = {'value1':'[1,2,3]',
'value2':'[4,5,6]'}
我希望按如下所示进行切换,扩展和转换:
new_dict = {1:1,
2:1,
3:1,
4:2,
5:2,
6:2}
那是我想要切换键和值,然后我希望字符串中的每个数字成为一个单独的整数键,在值方面,我希望字符串也转换为int例如'value1'-> 1。
我可以切换键和值:
switched_dict={val:key for (key, val) in initial_dict.items()}
我可以交换新值
new_values = {"value1":1, "value2":2}
fixed_values = {k: new_values.get(v, v) for k, v in switched_dict.items()}
所以我现在有一个看起来像这样的字典:
{'[1,2,3]':1, '[4,5,6]':2}
但是我不确定如何扩展密钥并将其转换为单个整数
答案 0 :(得分:3)
您可以使用ast.literal_eval
将密钥转换为整数列表:
import ast
fixed_values = {'[1,2,3]':1, '[4,5,6]':2}
result = {}
for k, v in fixed_values.items():
key_ints = ast.literal_eval(k)
for i in key_ints:
result[i] = v
答案 1 :(得分:1)
使用ast模块来解析列表。
import ast
initial_dict = {'value1':'[1,2,3]',
'value2':'[4,5,6]'}
expanded_vals = {k: ast.literal_eval(v) for k, v in initial_dict.items()}
result = {}
for k, v in expanded_vals.items():
for e in v:
result[e] = k
print(result)
答案 2 :(得分:0)
您可以使用以下方法将字符串转换为列表:
string
然后遍历列表,并将当前值添加到新字典中的每个键中。
编辑:有关工作代码,请参见@ jh314答案。他更快。
答案 3 :(得分:0)
使用初始字典理解列表:
initial_dict = {'value1':'[1,2,3]', 'value2':'[4,5,6]'}
new_values = {"value1": 1, "value2": 2}
{int(n): new_values.get(k) for (k,v) in initial_dict.items() for n in v[1:-1].split(',')}
结果:
{1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2}
答案 4 :(得分:0)
如果您想要一个可怕的单线,可以使用
initial_dict = {'value1':'[1,2,3]', 'value2':'[4,5,6]'}
new_values = {"value1": 1, "value2": 2}
new_dict = {z: y for x, y in ((v, new_values[k]) for k, v in initial_dict.items()) for z in eval(x)}
# new_dict = {1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2}
答案 5 :(得分:0)
从您说的步骤开始,您不确定如何继续,并假设字典中存储的列表始终存储数字:
1)迭代每个键值对
2)解析键的每个字符,如果该字符是数字,则更新新词典
my_dict = {'[1,2,3]':1,'[4,5,6]':2}
new_dict = {}
for dict_key, dict_value in my_dict.items():
for character in dict_key[:]:
if character.isdigit():
new_dict[character] = dict_value
答案 6 :(得分:0)
如果您想扩展自己的解决方案,则可以在fixed_values
上使用字典理解
import ast
# ...
new_values = {"value1":1, "value2":2}
fixed_values = {k: new_values.get(v, v) for k, v in switched_dict.items()}
final_dict = {i: v for (k,v) in fixed_values.items() for i in ast.literal_eval(k)}