2011-12-22 19 views
4

関数は、論理的にマップされたの2つのリストを返します。Pythonループ:マッピングマッチングリストを処理するための正確な方法

name = ["facebook", "twitter", "myspace"] 
hits = [4000, 2500, 1800] 

と仮定したがって、4000、さえずり2500、およびMySpaceの2500

ある私は

[ 
    {name: 'facebook',data: [4000]}, 
    {name: 'twitter',data: [2500]}, 
    {name: 'myspace',data: [1800]} 
] 

のような辞書のリストにこれらの二つの別々のリストを変換したいFacebookのためにヒット私の解決策は、これを行うです:

data = [ 
    {"name":l, "data":[v]} 
    for idx1, l in enumerate(labels) 
    for idx2, v in enumerate(values) 
    if idx1 == idx2 
    ] 

さらにエレガントな論理1対1マッピングを扱う方法はありますか、私の解決策は正確ですか?

+1

[zip](http://docs.python.org/library/functions.html#zip)は、あなたが探しているエレガンスの小さなナゲットです。 – tylerl

+1

あなたの例は本当に1対1の関係を具体化していますか? * twitter *と* myspace *の両方のヒット数が同じである可能性はありますか? –

+0

@RaymondHettinger:この質問は論理的なマッピングを示しています。意味名[0]はヒット[0]にマップされています。 –

答えて

13

あなたは行うことができます:

[{"name": n, "data": [h]} for n, h in zip(name, hits)] 

を、これはあなたが何を求めて、より多くのデータ構造は、あなたが本当に必要とするよりも、ここでは、おそらくありますんが。次の点を考慮してください。

>>> dict(zip(name, hits)) 
{'twitter': 2500, 'myspace': 1800, 'facebook': 4000} 

これは、アクセスしやすいデータ構造で同じデータセットを提供します。

+0

これはOPが求めていることですが、彼の仕事のための正しいデータ構造ではありません。 * name *と* data *のキーフィールドは無駄であり、内部リストも必要ではありません。 –

+1

私は同意する、私は私の答えを更新します。 –

0

あなただけの2つの辞書を使用して、アップデートを行うとき、両方に更新プログラムを適用する必要がありEfficient bidirectional hash table in Python?

と全く同じではないが類似。

また、ここでは論理的に矛盾があります。機能が1対1でないか、data: [...]を1つの値しかないのでリストに保持する必要はありません。

あなたは本当に1対1の関係を処理するための最も簡単かつ最速の方法は、2つの辞書にすることですhttps://stackoverflow.com/a/8600534/711085

4

で指摘したようにzipを使用し、辞書のリストに変換する必要がある場合:

>>> name = ["facebook", "twitter", "myspace"] 
>>> hits = [4000, 2500, 1800] 
>>> name2hits = dict(zip(name, hits)) 
>>> hit2name = dict(zip(hits, name)) 
関連する問題