【问题标题】:Reversing a Dict反转字典
【发布时间】:2014-12-08 23:14:17
【问题描述】:

我目前正在尝试制作一个反转字典键和值的函数。我在网上看了一下,发现了这个:

def reverse(d):
    return dict([(v, k) for k, v in d.iteritems()])

我的问题是我不确定这意味着什么。我理解单行上的 for 循环的想法,但我不确定 (v, k) for k, v 如何导致键和值被反转。有人可以帮我一把吗? (我确实在网上和 Stack Overflow 上搜索过这个,但什么都找不到。)

【问题讨论】:

  • 我会避免使用“reverse”这个词,因为这意味着顺序。您正在做的是 transposition 此处的键和值。
  • 如果你的价值观不是唯一的,你会怎么做?

标签: python for-loop dictionary


【解决方案1】:

for k, v in d.iteritems() 分别是 key kvalue v 所以用 (v, k) 反转 v 和 k 使得旧值成为键,旧键成为新值

In [7]: d = {1:10,2:20}

In [8]: d.items()
Out[8]: dict_items([(1, 10), (2, 20)]) # tuples of key and value

 In [1]: d = {1:10,2:20}

In [2]: for k,v in d.iteritems():
           print k,v
   ...:     
1 10 # 1 is the key 10 is the value
2 20
In [3]: new_d = {v:k for k,v in d.iteritems()} # swap key for value and value for key

In [4]: new_d
Out[4]: {10: 1, 20: 2}

您可能遇到的两个问题是重复值或不可散列的值,因此它们不能用作列表、集合等键......

In [5]: d = {1:2,2:2}

In [6]: new_d = {v:k for k,v in d.iteritems()}

In [7]: new_d
Out[7]: {2: 2} # now only one key and value in the dict

In [8]: d = {1:2,2:[2]}

In [9]: new_d = {v:k for k,v in d.iteritems()}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-46a3901ce850> in <module>()
----> 1 new_d = {v:k for k,v in d.iteritems()}

<ipython-input-9-46a3901ce850> in <dictcomp>((k, v))
----> 1 new_d = {v:k for k,v in d.iteritems()}

TypeError: unhashable type: 'list'

dict([(v, k) for k, v in d.iteritems()]){v:k for k,v in d.iteritems()} 的输出相同,主要区别在于前者还兼容python

如果您使用的是 python

dict((v, k) for k, v in d.iteritems())

【讨论】:

  • @GBA13:如果这个答案解决了您的问题,您应该考虑将其选为“已选答案”(答案左侧的绿色勾号)。它会帮助将来找到这个问题的人,它会给你代表,它会给 PadraicCunningham 代表,它会鼓励其他人在未来回答你的问题(系统地不选择答案的 OP不是很好......感知)双赢! (进一步参考:meta.stackexchange.com/questions/5234/…
【解决方案2】:

dict 构造函数可以接收可迭代的键/值对来创建字典,因此这段代码是说“从字典 d 中获取键/值对并创建一个新字典,其中 d 的值现在是键并且 d 的键成为值"

这就是为什么 (v,k) 被颠倒的原因,如果你没有像这样颠倒它们

 def reverse(d):
    return dict([(k, v) for k, v in d.iteritems()])

你会得到一个相同的字典。

还请注意,在 python 2.7 及更高版本中,您实际上可以使用更紧凑的:

{v:k for k,v in d.items()}

读起来更直观(至少对我来说),因为它看起来更像是一个列表推导式,只是它创建了一个字典。

【讨论】:

    【解决方案3】:

    好的,所以当您在字典上调用 iteritems() 时,它会为您的字典中的每个项目提供一个 (key, value) 元组:

    for item in d.iteritems():
        print(item)
    

    然后您可以使用 Python 将元组中的每个项目分配给单独的变量 元组解包语法:

    a, b = (1, 2)
    print(a)  # 1
    print(b)  # 2
    

    如果你将一个元组列表传递给dict(),它会将它们视为一个列表 (key, value) 项:

    eg_dict = dict([(a, 4), (b, 6)])
    print(eg_dict)
    

    最后,您发布的示例使用了 Python 的列表推导 语法:

    item_list = ['item' + str(n) for n in range(1, 6)]
    print(item_list)
    

    要了解您发布的代码 sn-p,您只需要 熟悉这些 Python 习语。如果您还没有看到任何 在那之前的这些技术中,它是一个相当密集的爆发 新信息,让您大开眼界。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 2021-08-21
      相关资源
      最近更新 更多