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:
over
setdefault
可以节省创建大量字典和列表对象的时间,但当结构简单时,这不会带来太多成本

鉴于这一投入:

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'中,这个错误在代码中没有发生。您实际运行了什么代码?