【问题标题】:Appending values to a key if key already exists (python/jython)如果键已经存在,则将值附加到键(python/jython)
【发布时间】:2012-06-01 04:08:38
【问题描述】:

我有一个需要编入字典的列表。该列表具有重复的(即将成为)具有不同值的键。如何找到这些键并将新值附加到其中?

list=[q:1,w:2,q:7]
dictionary= q:1,7
            w:2

提前致谢

【问题讨论】:

  • 列表通常没有键值对。您的列表是否包含元组或其他内容?此外,您希望以何种方式将值附加到其他值——您是否将它们视为字符串?因为您的示例表明它们被视为整数。

标签: python dictionary jython key


【解决方案1】:

在您的字典列表中创建值,以便您拥有:

dictionary = {'q': [1, 7],
              'w': [2]
}

等等。即,您的单项值是单项列表。这意味着当您有另一个'q' 时,您可以这样做:

dictionary['q'].append(5)

除了dictionary['q'] 将是KeyError 第一次执行此操作时,请改用setdefault

dictionary.setdefault('q', []).append(5)

所以现在您只需要遍历输入列表中的每个键值对,并为每个键值对执行上述操作。

您也可以选择dictionary 为:

dictionary = collections.defaultdict(list)

所以你可以只做dictionary['q'].append(5) - 它的工作方式与上述相同,在所有方面都是如此。如果在您解析了原始列表并正确设置了所有值之后,您的字典将如下所示:

dictionary = {'q': [1, 7, 5]
              'w': [2, 8, 10, 80]
              'x': [3]
}

然后你尝试做print(dictionary['y'])。你期望会发生什么?如果你使用普通的字典和setdefault,这被认为是一个错误,所以它会引发KeyError。如果您使用defaultdict,它将打印一个空列表。无论哪种方式对您的代码更有意义,都应该确定您的编码方式。

【讨论】:

  • 更好的是,使用collections.defaultdict(list)- 然后您可以像使用普通字典一样分配或查找。
  • @DavidRobinson 在这种情况下 defaultdict 是否优于 setdefault 是有争议的。当工厂函数很昂贵时,它们的主要好处就出现了——但构建一个空列表却不是。
  • 我会说这对代码紧凑性是有益的。您只定义一次字典,但可能会在代码中多次获取或设置值。
  • @DavidRobinson 我正要提醒你获取值不会受到影响,因为dictionary['q'] 给出了一个列表 - 但后来我意识到这不仅仅是一个审美决定。 x = dictionary['keynotset'] 应该做什么都有潜在的用例,thatdefaultdictdict.setdefault 之间的区别。我会更新我的答案来提及这一点。
猜你喜欢
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多