0

私は基本的にこれを行うために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

4 に答える 4

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__ をオーバーライドして、そこに格納されているものがラムダでない限り、(通常の辞書のように) 格納されているものをすべて返します。値がラムダの場合は、代わりに評価して結果を返します。

于 2013-08-01T22:48:33.323 に答える
0

複数のステートメントを使用しないと、少なくとも問題ステートメントのいくつかのメソッドを使用しないと不可能です。しかし、辞書内包表記を使用すると、次のようになります。

>>> 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 に答える
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")

しかし、実際には、ここで複数のステートメントを使用しない正当な理由はありません。おそらくもっと明確になるでしょう。そのため、私はそのようにします。

于 2013-08-01T21:52:34.210 に答える