Python筛选字典在一个键中使用唯一值,并创建另一个筛选字典
这个问题很琐碎,但我做不到 我有一本初始词典:Python筛选字典在一个键中使用唯一值,并创建另一个筛选字典,python,dictionary,filter,Python,Dictionary,Filter,这个问题很琐碎,但我做不到 我有一本初始词典: 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: {'
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
键的唯一值
谢谢各位
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:
oversetdefault
可以节省创建大量字典和列表对象的时间,但当结构简单时,这不会带来太多成本
鉴于这一投入:
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])
这将导致相同的结果
使用如果v不在r:
而不是setdefault
可以节省创建大量字典和列表对象的时间,但是当结构简单时,这不会带来太大的成本。对于更一般的情况(具有任意数量的键)
对于更一般的情况(具有任意数量的键)
谢谢你的快速回答。我从您的代码中得到这个错误:Traceback(最近一次调用last):File“”,第3行,在KeyError:'res'中,这个错误在代码中没有发生。你实际运行了什么代码?谢谢你的快速回答。我从您的代码中得到这个错误:Traceback(最近一次调用last):File“”,第3行,在KeyError:'res'中,这个错误在代码中没有发生。您实际运行了什么代码?