0

我正在使用 python 试图基本上做到这一点:

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

...如果你发现我的想法。可能不使用多个语句?

编辑:另外,如果有人能告诉我一个更好的方法来更清楚地说明这个问题,那就太酷了。我真的不知道该怎么说我在问什么。

EDIT2:似乎有些混乱 - 是的,它比“key2”:1 + 1更复杂,而且我所做的主要是为了代码可读性,因为如果我必须将它排成两行,它会变得混乱。

这是我正在尝试做的更准确的代码示例......尽管它仍然没有它得到的那么复杂: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

4 回答 4

0

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

在这种特殊情况下,您可以以一种 hacky 的方式绕过它。例如:

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

但实际上,这里没有充分的理由使用多个语句,而且它可能会更清晰,所以……我就那样做。

于 2013-08-01T21:52:34.210 回答
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,则改为对其进行评估并返回结果。

于 2013-08-01T22:48:33.323 回答
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}

当然,这些不是按顺序排列的,但它们都在那里。

于 2013-08-01T22:05:33.063 回答
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)]}

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

于 2013-08-01T22:06:31.077 回答