【问题标题】:How to reduce the sets in dict values using comprehension?如何使用理解减少 dict 值中的集合?
【发布时间】:2017-05-24 22:11:44
【问题描述】:

我有

x = {'a':set([1]) , 'b':set([2]), 'c':set([3]) }

保证集合中只有一个元素。我需要将其转换为

{'a': 1, 'c': 3, 'b': 2}

以下作品:

x1 = {k:x[k].pop() for k in x.keys()}  OR
x1 = {k:next(iter(x[k])) for k in x.keys()}

但我不喜欢它,因为pop() 这里正在修改原始集合。我需要以下帮助。

  • 如何在理解范围内将解包用作mentioned here
  • 有什么办法吗,我可以使用functools.reduce
  • 总体而言,有什么更好的或 Pythonic 的方式来做到这一点?

【问题讨论】:

  • functools.reduce 与您尝试执行的操作几乎无关。

标签: python python-2.7 dictionary iterable-unpacking functools


【解决方案1】:

如果你想通过拆包来做到这一点,那就是

{k: item for k, [item] in x.iteritems()}

【讨论】:

  • 这将在Python 3.5.2 中生成一个AttributeError
  • @ChihebNexus:确实会,但问题标记为 2.7。
  • 谢谢。这就是我想要的。顺便提一下,拆包还可以验证集合中只有一个元素,这里就是这种情况。对具有多个元素的元素进行解包会产生错误。
  • {k: item for k, [item] in x.items()} 将是这样做的方式有人正在寻找与 Python 2 和 3 兼容的版本。items 在 Python 2 中效率低下,但对于小列表应该无关紧要.
【解决方案2】:

在我看来,最易读的选项是使用nextiter解包可能也没什么用,因为它更像是一个赋值操作。(参见 user2357112 的回答)

简单地说:

>>> {k: next(iter(v)) for k, v in x.items()}
{'a': 1, 'c': 3, 'b': 2}

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2023-03-03
    • 2022-11-30
    相关资源
    最近更新 更多