【问题标题】:Removing one element from an entire dictionary从整个字典中删除一个元素
【发布时间】:2012-12-01 00:04:27
【问题描述】:

我已经在这件事上工作了几个小时,仍然无法弄清楚:O

我遇到的问题是这个。假设我有一个字典,其中 4 元素元组作为元素,整数作为键。当从整个字典(属于每个元组)中删除一个元素时,使两个元组(元素)相同,两个元组的键不会相加。相反,形成了一个新元素,该元素的键是前 2 个键之一。

假设我有一本字典:

dict={('A','B','D','C'): 4, ('C','B','A','D'):5, ('D','A','C','B'):3,('D','A','B','C'):1}

现在我想从整个字典中删除一个字母。 例如,如果我想删除“B”。以下新字典已形成,但未返回,因为其中两个元素相同。

 {('A','D','C'): 4, ('C','A','D'):5, ('D','A','C'):3,('D','A','C'):1}

而不是('D','A','C'):3,('D','A','C'):1 变成('D','A','C'):4,这就是最终发生的事情:

('D','A','C'):3 以及其他元组

所以基本上,其中一个元组消失了。

这是我目前使用的方法:

for next in dict:
new_tuple=()
for i in next:
    if i!='A':
        new_tuple+=(i,)
new_dict[new_tuple]=dict[next]

以上代码返回new_dict如下:

 {('A','D','C'): 4, ('C','A','D'):5, ('D','A','C'):3}

那么我该怎么做,从整个字典中的每个元组中删除一个字母,如果两个元组看起来相同,它们合并并且键加起来?

【问题讨论】:

  • 您的字典将元组作为键,整数作为值,而不是“元组作为元素,整数作为键”。
  • next 是 Python 中的保留字!
  • 字典在更改所有键时效率不高,因为您必须重新散列它们。

标签: python dictionary tuples


【解决方案1】:

您将不得不重建整个字典,因为每个键/值对都会受到影响。当您遇到现在重叠的键时,您可以使用defaultdict 使合并更容易:

from collections import defaultdict

new_dict = defaultdict(int)
for key, value in old_dict.items():
    new_key = tuple(i for i in key if i != 'A')
    new_dict[new_key] += value

因为第一次在new_dict 中查找new_key 时默认设置为0,所以我们只需添加旧值即可更新new_dict,以便我们第一次遇到键时。下次我们遇到键时,通过将它们相加来“合并”这些值。

【讨论】:

  • 有没有办法在不导入任何东西的情况下做到这一点?
  • 并且在你构建它之后,你可以设置new_dict.default_factory = None 使它像普通字典一样对待KeyErrors 等。
  • @JunaidPatel:当然,new_dict = {},然后用new_dict[new_key] = new_dict.get(new_key, 0) + value 代替new_dict[new_key] += value
猜你喜欢
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 2021-04-09
  • 2020-10-03
相关资源
最近更新 更多