2011-02-01 4 views
7

I以下の機能があります。メイクマップ()を返す辞書

[{'customer.customer_number': 0L}, {'customer.name': 2L}, ... ] 

が、私はこのように1つだけの辞書を好む:

def heading_positions(self): 
    return map(
      lambda h: 
       {'{t}.{c}'.format(t=h.table_name,c=h.column_name) : h.position }, 
       self.heading_set.all() 
      ) 

それは私にこのような出力を提供しますが

{'customer.customer_number': 0L, 'customer.name': 2L, ... 

map(または類似のもの)が、辞書の配列ではなくただ1つの辞書を返すようにする方法はありますか牡羊座?

答えて

7

dict(
    ('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position) 
    for h in self.heading_set.all() 
    ) 

が有効です。

+3

より最近のバージョン(dict内包表記を持つもの)では、 '{'{t}。{c}'。書式(...):hのh.positionはself.heading_set.all()}'にあります。 – delnan

+1

Dict内包表記は2.7/3.1に現れます。 –

2
return dict(('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position) 
      for h in self.heading_set.all()) 
1

他の回答が示すように、dict()の内包表記を使用できます。

しかし、おそらく好奇心として、あなたも reduce

EDITを使用することができます。コメントが言うように、dict()はこの場合は簡単です。しかし、私はそれが唯一の機能ビルディング・ブロックを使用して解決することが可能だということでしたどのような意味論のためだけのために(Pythonの魔法辞書内包表記なし):次に

def union(d1,d2): 
    result = {} 
    result.update(d1) 
    result.update(d2) 
    return result 

reduce(union, sequence_of_dictionaries, {}) 

また、あまりきれいけど

def update2(d1, d2): 
    dict.update(d1, d2) 
    return d1 

あるいは:

、最初の引数を返しますdict.updateの代替バージョンを使用して、より効率的な
update2 = lambda d1,d2: (d1, d1.update(d2))[0] 

その後:

reduce(update2, sequence_of_dictionaries, {}) 

はどこにこのケースでsequence_of_dictionaries次のようになります。

その後、 map()を使用する理由
[{'{t}.{c}'.format(t=h.table_name, c=h.column_name) : h.position} 
for h in self.heading_set.all()] 
+0

......何のために? – eumiro

+1

この場合、list comprehensionを持つdict()は簡単な解決策です。しかし、理論的に言えば、あなたは、私が目指していたものであった組合と空の辞任を倍以上にしたいと思っています。 – sinelaw

+0

あなたの答えが間違っている場合は、それを削除するか、修正してください。それが正しい場合、それを行う方法の例を含めてください。 – agf

6

はい。基本的な問題は、単一エントリdictから辞書を作成しないで、長さ2のシーケンス(key, value)のシーケンスから辞書を作成しないことです。だから、

、というよりも、機能を備えた独立したシングルエントリdictを作成するタプルを作成し、次にあなたがdict()コンストラクタを使用することができます

dict(map(lambda h: ('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position), 
     self.heading_set.all())) 

、または直接dictのコンストラクタの内部で生成するか、リスト内包表記を使用します:

dict(('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position) 
    for h in self.heading_set.all()) 

または、最新のバージョン(2.7、1)直接辞書の理解:

{'{t}.{c}'.format(t=h.table_name : c=h.column_name), h.position) 
    for h in self.heading_set.all()}