在dict中按值删除重复项

时间:2014-12-12 01:20:23

标签: python

在这里需要一些帮助,因为我在这个问题上过去一小时都在摸不着头脑:

items = {1: {'title': u'testing123', 'description': u'testing456'},
2: {'title': u'testing123', 'description': u'testing456'},
3: {'title': u'testing123', 'description': u'testing456'},
4: {'title': u'testing123', 'description': u'testing456'},
5: {'title': u'testing123', 'description': u'testing456'},
6: {'title': u'something', 'description': u'somethingelse'}}

itemscopy = items.copy()

for key1, val1 in itemscopy.iteritems():
    for key2, val2 in itemscopy.iteritems():
        if val1.get('description') == val2.get('description'):
            del items[key2]

我试图从items词典中删除重复项,以便结果排除所有重复项,但是,我将它们全部删除,以便我的最终结果是:

{6: {'title': u'something', 'description': u'somethingelse'}}

应该是:

{1: {'title': u'testing123', 'description': u'testing456'}, 6: {'title': u'something', 'description': u'somethingelse'}}

4 个答案:

答案 0 :(得分:3)

您可以创建自己的功能。我使用的是Python 3,但我认为唯一稍微改变的是items类的dict函数和处理异常的方式(语法)。

def remove_by_value(d, value):
    key = 0
    for k, v in d.items():  # iteritems 
        if v == value:
            key = k
            break
    try:
        del d[key] # in case the value is not in the dictionary
    except KeyError: 
        print('value not in the dictionary')
    return d

d = {"12":12, "14":14, "28":28}

print(remove_by_value(d, 28))  # print

答案 1 :(得分:2)

创建另一个具有值作为键的字典,然后检查

vals_seen = {}
for key, val in itemscopy.iteritems():
    if val['description'] in vals_seen:
        del items[key]
    else:
        vals_seen[val['description']] = 1

答案 2 :(得分:0)

因此,对于每个元素,您希望查看其值是否存在于其他元素中。

您的代码存在的问题是您正在检查密钥1。您可以通过添加if直接在and key1 != key2中排除此案例。

如果您将dict转换为应该唯一的值(或使用元组的值),那么您将得到相同的结果。

答案 3 :(得分:0)

我就是这样做的:

def customCount(value, d):
    return len([key for key in d if d[key]==value])

RemovedDuplicateDict = {k:items[k] for k in items.keys() if customCount(items[k], items) < 2}