Assign contents of Python dict to multiple variables at once?

前端 未结 5 2258
滥情空心
滥情空心 2021-02-20 07:41

I would like to do something like this

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

{ a, b } = f()     # or { \'a\', \'b\' } = f() ?
<
相关标签:
5条回答
  • 2021-02-20 08:05
    mydict = {'aa':2, 'bb':'john', 'cc':34, 'dd':'bye'}
    
    a, b, c, d = [mydict[k] for k in ['aa', 'bb', 'cc', 'dd']]
    
    0 讨论(0)
  • 2021-02-20 08:09

    It wouldn't make any sense for unpacking to depend on the variable names. The closest you can get is:

    a, b = [f()[k] for k in ('a', 'b')]
    

    This, of course, evaluates f() twice.


    You could write a function:

    def unpack(d, *keys)
        return tuple(d[k] for k in keys)
    

    Then do:

    a, b = unpack(f(), 'a', 'b')
    

    This is really all overkill though. Something simple would be better:

    result = f()
    a, b = result['a'], result['b']
    
    0 讨论(0)
  • 2021-02-20 08:19

    Consider making f a namedtuple Then you can just use f.a, f.b directly

    0 讨论(0)
  • 2021-02-20 08:21

    Hmm. Kind of odd since a dictionary is not ordered, so the value unpacking depends on the variable names. But, it's possible, if ugly:

    >>> locals().update(f())
    >>> a
    1
    

    Don't try this at home! It's a maintainability nightmare. But kinda cool too :-)

    0 讨论(0)
  • 2021-02-20 08:21

    You could use (or abuse) a function attribute to do this:

    >>> def f():
    ...    f.a=1
    ...    f.b=2
    ...    return { 'a' : f.a, 'b' : f.b, 'c' : 3 }
    ... 
    >>> f()
    {'a': 1, 'c': 3, 'b': 2}
    >>> a,b=f.a,f.b
    >>> a,b
    (1, 2)
    

    Be aware that the attributes only have value after f() is called or manually assigned.

    I (rarely) use function attributes as a fill-in for C's static class variables like so:

    >>> def f(i):
    ...    f.static+=i
    ...    return f.static
    >>> f.static=0
    >>> f(1)
    1
    >>> f(3)
    4
    

    There are better ways to do this, but just to be complete...

    0 讨论(0)
提交回复
热议问题