0

これをpythonicな方法で行う際に助けを求めています。

これまでの私のコード。
プロジェクトで後で使用するオブジェクトにリンクするキーとしてタプルを使用してディクショナリを作成するジェネレータを作成しました。
これを行うためのより良い方法があると確信しています。辞書とリストの理解としての私の試みは成功しませんでした。

app = models.get_app('djangoapp')
appmodels = models.get_models(app)

gen = mapEntGen(appmodels)  
d = {}  
for x in gen:  
    d.update(x)   

私のオブジェクトがどのように見えるかをより明確にするため。

for x in gen:
    print(x)

{('in', 1): <class 'djangoapp.models.entrance01IN'>}
{('out', 1): <class 'djangoapp.models.entrance01OUT'>}
{('in', 2): <class 'djangoapp.models.entrance02IN'>}
{('out', 2): <class 'djangoapp.models.entrance02OUT'>}
...

これらは私の失敗した理解の試みです

{d: aDict for aDict in mapEntGen(appmodels)}  
d = {key: value for (key, value) in gen}  
d = {key: value for (key, value) in mapEntGen(appmodels[1:])}  

問題は、他の 2 つのタイプではなく、既に辞書である可能性が高いと思います。これは、キーと値のペアとして使用できます。

----> 1 for k, v in gen:
      2     d[k] = v
      3 

ValueError: need more than 1 value to unpack

これは、ジェネレーターでオブジェクトのマップとそれらを見つけるためのキーを作成するために使用しているもう 1 つのコードです。

def mapEntGen(EntranceObj = []):    
    for x in EntranceObj:
        thisEnt = (x._meta.verbose_name[10:],
                   int(x._meta.verbose_name[8:10]))
        aDict = {thisEnt : x}
        yield aDict

重複しているように見えるかもしれませんが、これまでに試したすべての例のように、私が試したことはありません。

4

2 に答える 2

1

コードにまったく異なる方向性を与えるためだけに、コードの残りの部分に応じて、より読みやすく、使いやすくなる可能性があります。

mapGenEnt の代わりに、appModels から 2 つの別個のジェネレーターを作成しましょう (それが何であれ)。

  1. コードのリスト (後でキーとして使用する('out', 1).
  2. 実際のオブジェクト/モデルのリスト (後で<class 'djangoapp.models.entrance01IN'>.

したがって、次の 2 つのジェネレーターがあるとします。

def code_names(EntranceObj):
   return ((entrance._meta.verbose_name[10:], int(entrance._meta.verbose_name[8:10]) for entrance in EntranceObj)

def entries(EntranceObj):
   return EntranceObj    # Shorter than: (entrance for entrance in EntranceObj)

これで、明らかに独自のことを行う 2 つの関数ができたので、 を作成する必要がありますdzipまたはを使用して簡単itertools.izip

d = dict(zip(code_names(appmodels), entries(appmodels)))

読みやすさをもう少し向上させるために、個人的にこの関数に次のような名前を付けgenerate_model_entries(appmodels)ます。

def generate_model_entries(models):
    return dict(zip(code_names(models), entries(models)))

d = generate_model_entries(appmodels)

PS: ループ変数よりも正確な名前がある場合はx、お願いします。これを使って。

于 2014-08-26T21:15:21.540 に答える