是否可以在一次调用中“解压”一个字典?

问题描述 投票:0回答:4

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

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

我的问题可能更简单:我从一个函数中获取一个字典,并想即时剖析它,知道我需要的键(我可能不需要每次都需要所有键)。现在我只能做

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()

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

可以进行这样的操作吗?

python dictionary unpack
4个回答
4
投票

如果确实需要,您可以使用

operator.itemgetter()
对象 将多个键的值提取为元组:

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) 

0
投票

除了

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

0
投票

如果你来自 javascript 世界,你可能会错过这种语法:

const {a, b} = d

这是在 python 中实现这一点的肮脏方法:

import traceback

def dict_unpack(d: dict):
    stack = traceback.extract_stack()
    for frame_summary in stack:
        if 'dict_unpack' in frame_summary.line:
            lhs = frame_summary.line.split('=')[0].strip()
            if lhs[0] == '[':
                assert lhs[-1] == ']'
                lhs = lhs[1:-1]
            if lhs[0] == '(':
                assert lhs[-1] == ')'
                lhs = lhs[1:-1]
            keys = [s.strip() for s in lhs.split(',') if s]
            return [d[key] for key in keys]


d = {
    'a': 4,
    'b': 5,
}
a, b = dict_unpack(d)
print(a)
print(b)

打印:

4
5

但是使用它基本上是一种黑客行为,所以只将它用于你有趣的小脚本。我建议不要在大型项目中使用它,因为它会让同事感到困惑,可能会导致新的错误,并且通常会增加代码的复杂性。

© www.soinside.com 2019 - 2024. All rights reserved.