python方向键映射_Python反转/反转映射(但每个键都有多个值)

TL;DR

像这样使用字典理解>>> my_map = { 'a': ['b', 'c'], 'd': ['e', 'f'] }

>>> {value: key for key in my_map for value in my_map[key]}

{'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'}

上面看到的字典理解在功能上等价于下面填充空字典的循环结构

^{pr2}$

注意:使用map隐藏了内置的^{}函数。所以,除非你知道你在做什么,否则不要用它作为变量名。在

其他类似的方法

Python3.x版

您可以使用^{},如下所示>>> {value: key for key, values in my_map.items() for value in values}

{'c': 'a', 'f': 'd', 'b': 'a', 'e': 'd'}

我们在这里使用items()方法,它将从字典中创建一个视图对象,该对象将在迭代时给出键值对。所以我们只需迭代它,用逆映射构造一个新的字典。在

Python2.x版

您可以像这样使用^{}>>> {value: key for key, values in my_map.iteritems() for value in values}

{'c': 'a', 'b': 'a', 'e': 'd', 'f': 'd'}

我们不喜欢2.x中的items()方法,因为它将返回键值对的列表。我们不想仅仅为了迭代和构建一个新字典而构建一个列表。这就是为什么我们更喜欢iteritems(),它返回一个迭代器对象,该对象在迭代时给出一个键值对。在

注意:python3.x的items的实际等价物是python2.x的^{}方法,它返回一个view对象。阅读官方文档here中有关视图对象的更多信息。在

^python2.x中的{}与view*方法

python2.x中iter*函数和view*函数之间的主要区别在于,视图对象反映了字典的当前状态。例如>>> d = {1: 2}

>>> iter_items = d.iteritems()

>>> view_items = d.viewitems()

现在我们给字典添加了一个新元素>>> d[2] = 3

如果您试图检查(2, 3)(键值对)是否在iter_items中,它将抛出一个错误>>> (2, 3) in iter_items

Traceback (most recent call last):

File "", line 1, in

RuntimeError: dictionary changed size during iteration

但是view对象将反映字典的当前状态。所以,它会很好的>>> (2, 3) in view_items

True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值