我正在尝试删除复杂字典中的重复值
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,如果有更快的方法可以做到这一点,因为我有很多数据需要处理。任何帮助将不胜感激!
答案 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