在同一个字典中使用另一个值声明字典?

时间:2013-08-01 21:46:17

标签: python dictionary

我正在使用python尝试基本上这样做:

myDict = {"key1" : 1, "key2" : myDict["key1"]+1}

...如果你抓住了我的漂移。可以不使用多个语句吗?

编辑:此外,如果有人能告诉我一个更好的方式来更清楚地说明这个问题会很酷。我真的不知道如何说出我的要求。

EDIT2:似乎有些困惑 - 是的,它比“key2”更复杂:1 + 1,而我正在做的主要是代码可读性,因为如果我必须使用2行代码它会变得混乱

以下是我正在尝试做的更准确的代码示例...尽管它仍然没有像它那样复杂:P

lvls={easy:  {mapsize:(10,10), winPos:(mapsize[0]-1,mapsize[1]-1)},
      medium:{mapsize:(15,15), winPos:(mapsize[0]-RANDOMINT,mapsize[1]-1)},
      hard:  {mapsize:(20,20), winPos:(mapsize[0]-RANDOMINT,mapsize[1]-RANDOMINT)}
     }

4 个答案:

答案 0 :(得分:0)

不,如果不使用多个语句,这通常是不可能的。

在这种特殊情况下,你可以用一种黑客的方式绕过它。例如:

myDict = dict(zip(("key1", "key2"), itertools.count(1))

但是,只有当您想要指定一个起始值而其他所有内容都是顺序的时,这才会起作用,并且可能对于您想要的内容而言不够通用。

如果你正在做很多这样的事情,你可以将这些多个语句包含在一些适当的通用函数中,这样每个特定的实例只是一个表达式。例如:

def make_funky_dict(*args):
    myDict = {}
    for key, value in zip(*[iter(a)]*2):
        if value in myDict:
            value = myDict[value] + 1
        myDict[key] = value
    return myDict

myDict = make_funky_dict("key1", 1, "key2", "key1")

但实际上,没有充分的理由在这里使用多个语句,它可能会更加清晰,所以......我只是这样做。

答案 1 :(得分:0)

不使用多个语句是不可能的,至少不使用问题陈述中的某些方法。但是这里有一些东西,使用dict理解:

>>> myDict = {"key" + str(key): value for (key, value) in enumerate(range(7))}
>>> myDict
{'key0': 0,
 'key1': 1,
 'key2': 2,
 'key3': 3,
 'key4': 4,
 'key5': 5,
 'key6': 6}

当然那些不合适,但他们都在那里。

答案 2 :(得分:0)

您尝试使用的唯一变量是整数。一个不错的功能怎么样:

def makelevel(size,jitterfunc=lambda:0):
    return {'mapsize':(size,size), 'winPos':(size-1+jitterfunc(),size-1+jitterfunc())}

lvls = {hardness,makelevel(size) for hardness, size in [('easy',10),('medium',15), ('hard',20)]}

当然,这个函数看起来有点像构造函数。也许你应该使用对象?

答案 3 :(得分:0)

如果您想要一个允许您按需评估值的字典,您可以执行以下操作:

class myDictType(dict):                                                                
  def __getitem__(self, key):                                                      
    retval = dict.__getitem__(self,key)                                            
    if type(retval) == type(lambda: 1):                                            
      return retval()                                                              
    return retval                                                                  

myDict = myDictType()                                                                     

myDict['bar'] = lambda: foo['foo'] + 1                                                

myDict['foo'] = 1                                                                     
print myDict['bar']   #This'll print a 2                                                       
myDict['foo'] = 2                                                                   
print myDict['bar']   #This'll print a 3                                                     

这会覆盖字典中的__getitem__以返回存储在其中的内容(如普通字典),除非存储的是lambda。如果值是lambda,则它会对其进行求值并返回结果。