python删除字典中的重复值并更改密钥

时间:2015-04-30 16:40:22

标签: python dictionary

我正在尝试删除复杂字典中的重复值

a = {0:{'time':11}, 1:{'time':12}, 2:{'time':12}, 3:{'time':13}}

有没有办法删除2:{'time':12},并获得

b = {0:{'time':11}, 1:{'time':12}, 2:{'time':13}}

我的代码是

m = {}
for key, value in a.items():
    if key == 0:
        m[0] = value
elif a[key] != a[key -1]:
    m[key] = value

但结果是{0: {'time': 11}, 1: {'time': 12}, 3: {'time': 13}} 我想知道是否有任何方法可以将结果作为dict b,如果有更快的方法可以做到这一点,因为我有很多数据需要处理。任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:3)

首先,让我们创建所有时间的列表:

>>> c = [a[k]['time'] for k in sorted(a)]
>>> c
[11, 12, 12, 13]

然后让我们使用groupby按连续相等的值进行分组:

>>> from itertools import groupby
>>> d = [x for x, y in groupby(c)]
>>> d
[11, 12, 13]

现在我们可以使用新值压缩键并创建字典:

 >>> dict(zip(sorted(a), d))
 {0: 11, 1: 12, 2: 13}

我们可以结合所有步骤:

>>> keys = sorted(a)
>>> dict(zip(keys, (x for x, y in groupby(a[k]['time'] for k in keys))))
{0: 11, 1: 12, 2: 13}

答案 1 :(得分:0)

您可以使用pop从字典中删除元素,并使用myDict[key]语法分配它们,这只是

a = {0:{'time':11}, 1:{'time':12}, 2:{'time':12}, 3:{'time':13}}
a[2] = a.pop(3)
a = {0: {'time': 11}, 1: {'time': 12}, 2: {'time': 13}}

从示例中可以看出,这是为您的任务组织字典的正确方法。例如,如果字典中的唯一值为{'time': <someNumber>},为什么不将值设为someNumber

另外如其他地方所述,在需要排序的字典上循环是一个非常糟糕的主意,因为元素不能保证按照你认为的顺序排列。

答案 2 :(得分:0)

您可以改为使用元组,而不是将值保存为单独的字典项吗?例如,您的密钥可以是1,2等,也可以是您的值('时间',11)或('时间',12)。我真的假设你的值不会被改变,所以像tuple这样的不可变数据类型可能是一个解决方案。

答案 3 :(得分:0)

使用反向映射到最小索引:

for k, v in a.iteritems():
    key = v['time']
    # we want the minimal index of the item
    reverse_mapping[key] = min(v, reverse_mapping.get(key, k))

现在,在您过滤了不必要的项目之后,再次反转映射:

reversed_original = {v: k for k, v in reverse_mapping.iteritems()}

现在根据筛选列表创建一个新的项目列表,并使用dict构造函数从中恢复dict

result = dict([(x, {'time': v[1]}) for x, v in enumerate(
    sorted(reversed_original.iteritems())
)])

输出:

{0: {'time': 11}, 1: {'time': 12}, 2: {'time': 13}}

答案 4 :(得分:0)

字典可能不是你想要的这种任务。相反,使用堆优先级队列,这是一种有效的自我排序替代方案,具体取决于您选择的某些密钥。 python.org – Heap queue algorithm