【问题标题】:Python filter dictionary unique values in a key and create another filtered dictionaryPython过滤键中的字典唯一值并创建另一个过滤字典
【发布时间】:2016-12-01 15:06:54
【问题描述】:

这个问题是微不足道的,但我做不到。

我有这个初始字典:

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 键的唯一值。

谢谢大家

【问题讨论】:

    标签: python dictionary filter


    【解决方案1】:
    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 可以节省创建大量字典和列表对象,但是当结构简单时,成本并不高。

    【讨论】:

    • 感谢您的超级快速回答。我的代码出现此错误: Traceback (last recent call last): File "", line 3, in KeyError: 'res'
    • 此代码中不会出现该错误。你实际运行了什么代码?
    【解决方案2】:

    对于更一般的情况(任意数量的键)

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2022-12-22
      • 2014-12-07
      相关资源
      最近更新 更多