从具有多个值的字典中删除值

时间:2012-11-26 19:09:17

标签: python dictionary

我一直在尝试从python中的字典中的多个值中删除特定项,但我不完全确定如何执行此操作。例如,在字典中:

d  = {('hello', 'hi', 'how are you'): 2, ('hi', 'hello', 'how are you'): 1}

我如何删除'hi'以便剩下的就是:

d  = {('hello', 'how are you'): 2, ('hello', 'how are you'): 1}

4 个答案:

答案 0 :(得分:3)

您显然想要更改密钥。因此,您只需要使用新密钥存储相应的值并删除旧密钥。但是,在您的情况下,创建新的dict更容易,因为您要修改每个项目。

d2 = {}
for key, value in d.iteritems():
    key = list(key)
    if 'hi' in key:
        key.remove('hi')
    d2[tuple(key)] = value

d2现在包含{('hello', 'how are you'): 1}

正如您所看到的,它只包含一个值,与您的示例不同,因为dicts不能包含两次相同的密钥。

答案 1 :(得分:2)

这里不会得到预期的输出,因为两个键现在都相同。因此,在最终的词典中只能找到其中一个。

In [142]: d  = {('hello', 'hi', 'how are you'): 2, ('hi', 'hello', 'how are you'): 1}

In [143]: {tuple(y for y in x if y!='hi'):d[x] for x in d}
Out[143]: {('hello', 'how are you'): 1}

答案 2 :(得分:1)

这应该这样做

answer = {}
for k,v in d.iteritems():
    key = tuple(i for i in k if i!='hi')
    answer[key] = v
d = answer

答案 3 :(得分:1)

不确定这是否适合您,但这会创建一个新字典,并将在删除'hi'后最终发生碰撞的任何键的值相加(假设这是您想要做的 - 如果不是,请忽略不计这个答案:)):

>>> from collections import defaultdict
>>> new_d = defaultdict(int)
>>> for k, v in d.iteritems():
...   new_d[tuple(i for i in k if i != 'hi')] += v
...
>>> new_d
defaultdict(<type 'int'>, {('hello', 'how are you'): 3})

这与您的输出不符,但正如其他人所解释的那样,词典只能有一个特定值的键,因此它合并为一个。