我正在使用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)}
}
答案 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,则它会对其进行求值并返回结果。