【问题标题】:Is it possible to "unpack" a dict in one call?是否可以在一次通话中“解压”字典?
【发布时间】:2015-09-30 08:36:38
【问题描述】:

我正在寻找一种以通用方式“解包”字典的方法,并找到了解释各种技术的 a relevant question(和答案)(TL;DR:它不太优雅)。

然而,这个问题解决了 dict 的键未知的情况,OP 打算将它们自动添加到本地命名空间。

我的问题可能更简单:我从一个函数中得到一个 dict,并想动态剖析它,知道我需要的键(我可能不是每次都需要它们)。现在我只能做

def myfunc():
    return {'a': 1, 'b': 2, 'c': 3}

x = myfunc()
a = x['a']
my_b_so_that_the_name_differs_from_the_key = x['b']
# I do not need c this time

当我在寻找等价物时

def myotherfunc():
    return 1, 2

a, b = myotherfunc()

但是对于一个 dict (这是我的函数返回的)。我不想使用后一种解决方案有几个原因,其中一个原因是哪个变量对应于哪个返回的元素并不明显(第一种解决方案至少具有可读性的优点)。

这样的操作可以吗?

【问题讨论】:

  • a, b = foo().get('a'), foo().get('b') 我想可以工作。以通常的方式解包的问题是字典的无序性质。
  • 谢谢,但我不想调用该函数两次(或更多),否则我会选择我的问题中提到的(第一个)解决方案。

标签: python dictionary unpack


【解决方案1】:

如果您确实需要,您可以使用operator.itemgetter() object 将多个键的值提取为一个元组:

from operator import itemgetter

a, b = itemgetter('a', 'b')(myfunc())

这还不漂亮;我更喜欢显式和 可读 单独的行,您首先分配返回值,然后提取这些值。

演示:

>>> from operator import itemgetter
>>> def myfunc():
...     return {'a': 1, 'b': 2, 'c': 3}
... 
>>> itemgetter('a', 'b')(myfunc())
(1, 2)
>>> a, b = itemgetter('a', 'b')(myfunc())
>>> a
1
>>> b
2

【讨论】:

    【解决方案2】:

    你也可以使用地图:

    def myfunc():
        return {'a': 1, 'b': 2, 'c': 3}
    
    a,b = map(myfunc().get,["a","b"])
    print(a,b) 
    

    【讨论】:

      【解决方案3】:

      除了operator.itemgetter()方法,你还可以自己写myotherfunc()。它将所需键的列表作为参数并返回其对应值的元组。

      def myotherfunc(keys_list):
          reference_dict = myfunc()
          return tuple(reference_dict[key] for key in keys_list)
      
      >>> a,b = myotherfunc(['a','b'])
      >>> a
      1
      >>> b
      2
      
      >>> a,c = myotherfunc(['a','c'])
      >>> a
      1
      >>> c
      3
      

      【讨论】:

        猜你喜欢
        • 2019-12-05
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 2021-10-14
        • 2021-10-24
        • 2021-12-31
        • 1970-01-01
        相关资源
        最近更新 更多