代码之家  ›  专栏  ›  技术社区  ›  hatmatrix

正在销毁绑定字典内容

  •  32
  • hatmatrix  · 技术社区  · 16 年前

    我试图“破坏”一个字典,并将值与其键后的变量名相关联。类似的东西

    params = {'a':1,'b':2}
    a,b = params.values()
    

    但由于字典没有订购,所以不能保证 params.values() 将按以下顺序返回值 (a, b) . 有什么好办法吗?

    9 回复  |  直到 7 年前
        1
  •  7
  •   joaquin    16 年前

    如果您害怕使用本地字典所涉及的问题,并且更愿意遵循您的原始策略,那么可以从python 2.7和3.1中订购字典。 collections.OrderedDicts 允许您按字典项的首次插入顺序恢复字典项

        2
  •  23
  •   ShawnFumo    11 年前

    一种比Jochen的建议少重复的方法是使用辅助函数。这样可以灵活地按任意顺序列出变量名,并且只破坏dict中的一个子集:

    pluck = lambda dict, *args: (dict[arg] for arg in args)
    
    things = {'blah': 'bleh', 'foo': 'bar'}
    foo, blah = pluck(things, 'foo', 'blah')
    

    此外,您可以对键进行排序并获取值,而不是Joaquin的ordereddict。唯一的捕获是需要按字母顺序指定变量名,并销毁dict中的所有内容:

    sorted_vals = lambda dict: (t[1] for t in sorted(dict.items()))
    
    things = {'foo': 'bar', 'blah': 'bleh'}
    blah, foo = sorted_vals(things)
    
        3
  •  13
  •   Sylvain Leroux    11 年前

    python只能“破坏”序列,而不是字典。所以,要想写下你想要的,你必须把需要的条目映射到一个适当的序列。就我自己而言,我能找到的最接近的匹配是(不是很性感):

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

    这也适用于发电机:

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

    下面是一个完整的例子:

    >>> d = dict(a=1,b=2,c=3)
    >>> d
    {'a': 1, 'c': 3, 'b': 2}
    >>> a, b = [d[k] for k in ('a','b')]
    >>> a
    1
    >>> b
    2
    >>> a, b = (d[k] for k in ('a','b'))
    >>> a
    1
    >>> b
    2
    
        4
  •  8
  •   Jochen Ritzel    16 年前

    也许你真的想这样做?

    def some_func(a, b):
      print a,b
    
    params = {'a':1,'b':2}
    
    some_func(**params) # equiv to some_func(a=1, b=2)
    
        5
  •  7
  •   Zachary822    8 年前
    from operator import itemgetter
    
    params = {'a': 1, 'b': 2}
    
    a, b = itemgetter('a', 'b')(params)
    

    与其使用复杂的lambda函数或字典理解,不如使用内置库。

        6
  •  3
  •   Junaid    8 年前

    试试这个

    d = {'a':'Apple', 'b':'Banana','c':'Carrot'}
    a,b,c = [d[k] for k in ('a', 'b','c')]
    

    结果:

    a == 'Apple'
    b == 'Banana'
    c == 'Carrot'
    
        7
  •  2
  •   abyx    16 年前

    好吧,如果你想在课堂上学习这些,你可以一直这样做:

    class AttributeDict(dict):
        def __init__(self, *args, **kwargs):
            super(AttributeDict, self).__init__(*args, **kwargs)
            self.__dict__.update(self)
    
    d = AttributeDict(a=1, b=2)
    
        8
  •  1
  •   O Sharv    7 年前

    这是另一种类似于 destructuring assignment JS作品:

    params = {'b': 2, 'a': 1}
    a, b, rest = (lambda a, b, **rest: (a, b, rest))(**params)
    

    我们所做的是将params字典解包为键值(使用**)(如 Jochen's answer ,然后我们在lambda签名中获取这些值,并根据键名分配它们-这是一个额外的-我们还得到了一个字典,其中包含 不 在lambda的签名中,所以如果你有:

    params = {'b': 2, 'a': 1, 'c': 3}
    a, b, rest = (lambda a, b, **rest: (a, b, rest))(**params)
    

    应用lambda后,rest变量现在将包含: { C’:3 }

    用于从字典中省略不需要的键。

    希望这有帮助。

        9
  •  0
  •   Johannes Charra    16 年前

    我不知道它的样式是否好,但是

    locals().update(params)

    会成功的。然后你有 a , b 无论你身上有什么 params dict可用作相应的局部变量。