Python过滤字典键中的唯一值并创建另一个过滤字典

时间:2016-12-01 15:06:54

标签: 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: {'res': [1.2], 'obs': [3]}, 3: {'res': [4.5], 'obs': [4]}, 4: {'res': [1.5, 3.4], 'obs': [5, 6]}}

所以这个字典的键是原始字典的sp键的唯一值。

谢谢你们

2 个答案:

答案 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