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

Python变量作为dict的键

  •  57
  • rxmnnxfpvg  · 技术社区  · 14 年前

    在Python(2.7)中有更简单的方法来实现这一点吗?:注意:这一点也不奇怪,比如将所有局部变量放入字典中。只是我在列表中指定的那些。

    apple = 1
    banana = 'f'
    carrot = 3
    fruitdict = {}
    
    # I want to set the key equal to variable name, and value equal to variable value
    # is there a more Pythonic way to get {'apple': 1, 'banana': 'f', 'carrot': 3}?
    
    for x in [apple, banana, carrot]:
        fruitdict[x] = x # (Won't work)
    
    11 回复  |  直到 12 年前
        1
  •  74
  •   dr jimbob    14 年前
    for i in ('apple', 'banana', 'carrot'):
        fruitdict[i] = locals()[i]
    
        2
  •  18
  •   Greg Hewgill    14 年前

    这个 globals()

    >>> apple = 1
    >>> banana = 'f'
    >>> carrot = 3
    >>> globals()
    {'carrot': 3, 'apple': 1, '__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'banana': 'f'}
    

    还有一个类似的函数叫做 locals() .

    我意识到这可能并不是您想要的,但它可以提供一些关于Python如何提供对变量的访问的见解。

    编辑 :听起来你的问题也许可以通过简单地使用字典来更好地解决:

    fruitdict = {}
    fruitdict['apple'] = 1
    fruitdict['banana'] = 'f'
    fruitdict['carrot'] = 3
    
        3
  •  6
  •   Dantalion    14 年前

    一行是:-

    fruitdict = dict(zip(('apple','banana','carrot'), (1,'f', '3'))
    
        4
  •  3
  •   Christian Vanderwall    8 年前

    这里是一行,无需重新键入任何变量或其值:

    fruitdict.update({k:v for k,v in locals().copy().iteritems() if k[:2] != '__' and k != 'fruitdict'})
    
        5
  •  2
  •   Arnout    10 年前

    根据mouad的回答,这里有一种更像蟒蛇的方法来根据前缀选择变量:

    # All the vars that I want to get start with fruit_
    fruit_apple = 1
    fruit_carrot = 'f'
    rotten = 666
    
    prefix = 'fruit_'
    sourcedict = locals()
    fruitdict = { v[len(prefix):] : sourcedict[v]
                  for v in sourcedict
                  if v.startswith(prefix) }
    # fruitdict = {'carrot': 'f', 'apple': 1}
    

    您甚至可以将其放入一个以prefix和sourcedict作为参数的函数中。

        6
  •  1
  •   Caleb Hattingh    14 年前

    如果要绑定变量本身的位置,可以这样做:

    >>> apple = 1
    >>> banana = 'f'
    >>> carrot = 3
    >>> fruitdict = {}
    >>> fruitdict['apple'] = lambda : apple
    >>> fruitdict['banana'] = lambda : banana
    >>> fruitdict['carrot'] = lambda : carrot
    >>> for k in fruitdict.keys():
    ...     print k, fruitdict[k]()
    ... 
    carrot 3
    apple 1
    banana f
    >>> apple = 7
    >>> for k in fruitdict.keys():
    ...     print k, fruitdict[k]()
    ... 
    carrot 3
    apple 7
    banana f
    
        7
  •  1
  •   Lucas Piyush S. Wanare    6 年前

    to_dict = lambda **k: k
    apple = 1
    banana = 'f'
    carrot = 3
    to_dict(apple=apple, banana=banana, carrot=carrot)
    #{'apple': 1, 'banana': 'f', 'carrot': 3}
    
        8
  •  0
  •   Jim Dennis    14 年前

    嗯,这有点,嗯。。。非蟒蛇。。。丑陋的。。。粗俗的。。。

    下面是一段代码,假设您要创建一个包含所有本地变量的字典 在执行特定检查点后创建:

    checkpoint = [ 'checkpoint' ] + locals().keys()[:]
    ## Various local assigments here ...
    var_keys_since_checkpoint = set(locals().keys()) - set(checkpoint)
    new_vars = dict()
    for each in var_keys_since_checkpoint:
       new_vars[each] = locals()[each]
    

    注意,我们在捕获 locals().keys() 我还明确地从中分了一杯羹,不过在这种情况下不必这样做,因为要将引用添加到“['checkpoint']列表中,就必须将其展平。但是,如果您正在使用此代码的变体,并试图将 ['checkpoint'] + portion (because that key was already in 局部变量() , for example) ... then, without the [:] slice you could end up with a reference to the locals().keys()`其值将随着您添加变量而更改。

    我想不出一种方法来称呼 new_vars.update() 带有要添加/更新的密钥列表。所以 for

        9
  •  0
  •   mouad    14 年前

    为什么你不做相反的事:

    fruitdict = { 
          'apple':1,
          'banana':'f',
          'carrot':3,
    }
    
    locals().update(fruitdict)
    

    更新:

    顺便说一句,你为什么不标记你想得到的变量我不知道 可能是这样的:

    # All the vars that i want to get are followed by _fruit
    apple_fruit = 1
    carrot_fruit = 'f'
    
    for var in locals():
        if var.endswith('fruit'):
           you_dict.update({var:locals()[var])
    
        10
  •  0
  •   Terence Honles    14 年前

    这一点也不奇怪,比如 将所有局部变量放入 字典。

    你想要的是:

    apple = 1
    banana = 'f'
    carrot = 3
    fruitdict = {}
    
    # I want to set the key equal to variable name, and value equal to variable value
    # is there a more Pythonic way to get {'apple': 1, 'banana': 'f', 'carrot': 3}?
    
    names= 'apple banana carrot'.split() # I'm just being lazy for this post
    items = globals()                    # or locals()
    
    for name in names:
        fruitdict[name] = items[name]
    

    老实说,你所做的只是把一本字典里的东西复制到另一本字典里。

    (格雷格·休吉尔几乎给出了全部答案,我刚刚完成)

    ……就像人们建议的那样,你应该首先把这些放进字典里,但我想,出于某种原因,你不能

        11
  •  -2
  •   user1734291    11 年前
    a = "something"
    randround = {}
    randround['A'] = "%s" % a
    

    工作。