这个问题很简单,但我无法做到。
我有这个初始字典:
d = {'res': [1.1, 2.2, 1.2, 4.5, 1.5, 3.4], 'sp': [1, 1, 2, 3, 4, 4], 'obs': [1, 2, 3, 4, 5, 6]}
我想获取sp
键的每个值并将其转换为新词典的键,其中,对于每个唯一值,我有另一个具有相干其他键值的词典。
最终输出应该更好地解释问题:
new_dict = {1: {'res': [1.1, 2.2], 'obs': [1, 2]}, 2: {'res': [1.2], 'obs': [3]}, 3: {'res': [4.5], 'obs': [4]}, 4: {'res': [1.5, 3.4], 'obs': [5, 6]}}
所以这个字典的键是原始字典的sp
键的唯一值。
谢谢你们
答案 0 :(得分:4)
d = {'res': [1.1, 2.2, 1.2, 4.5, 1.5, 3.4], 'sp': [1, 1, 2, 3, 4, 4], 'obs': [1, 2, 3, 4, 5, 6]}
鉴于输入:
r = {}
for i, v in enumerate(d['sp']):
r.setdefault(v, {'res':[],'obs':[]})
r[v]['res'].append(d['res'][i])
r[v]['obs'].append(d['obs'][i])
这导致:
>>> r
{1: {'res': [1.1, 2.2], 'obs': [1, 2]}, 2: {'res': [1.2], 'obs': [3]}, 3: {'res': [4.5], 'obs': [4]}, 4: {'res': [1.5, 3.4], 'obs': [5, 6]}}
为任意数量的参数扩展第一个解决方案很简单:
r = {}
keys = set(d) - set(['sp'])
for i, v in enumerate(d['sp']):
if v not in r:
r[v] = dict((k, []) for k in keys)
for k in keys:
r[v][k].append(d[k][i])
这导致相同的结果。
使用if v not in r:
而不是setdefault
可以节省大量的字典和列表对象,但是当结构很简单时,费用不会很高。
答案 1 :(得分:0)
对于更一般的情况(具有任意数量的键)
new_dict = {}
for current_value in set(d['sp']):
new_dict[current_value] = {}
indices = [current_value == val for val in d['sp']]
for key, values in d.items():
if key != 'sp':
filtered_values = []
for value, index in zip(values, indices):
if index:
filtered_values.append(value)
new_dict[current_value][key] = filtered_values