1

私は次のデータ構造を持っています:{'one':['a','b','c'],'two':['q','w','e'],'three':['t','u','y'],...}。したがって、辞書にはキーのバリアント数があります。dictのキーによって選択された各配列の長さは同じです。この構造を次のように変換するにはどうすればよい[{'one':'a','two':'q','three':'t'},{'one':'b','two':'w','three':'y'},...]ですか?

itertools.izip()を使用する必要があると思いますが、事前定義されていない引数の数でそれを適用するにはどうすればよいですか?多分このようなもの:itertools.izip([data[l] for l in data.keys()])

TIA!

4

2 に答える 2

2

それほどエレガントではありませんが、トリックはあります:

In [9]: [{k:v[i] for (k,v) in d.items()} for i in range(len(d.values()[0]))]
Out[9]: 
[{'one': 'a', 'three': 't', 'two': 'q'},
 {'one': 'b', 'three': 'u', 'two': 'w'},
 {'one': 'c', 'three': 'y', 'two': 'e'}]

ループを表現するためのより良い方法が必要だと考えずにはいられiませんが、今のところ何も思い浮かびません。

または:

In [50]: map(dict, zip(*[[(k, v) for v in l] for k, l in d.items()]))
Out[50]: 
[{'one': 'a', 'three': 't', 'two': 'q'},
 {'one': 'b', 'three': 'u', 'two': 'w'},
 {'one': 'c', 'three': 'y', 'two': 'e'}]

ただし、これが読みやすさの面で大幅に改善されているかどうかはわかりません。

于 2013-01-24T17:28:47.963 に答える
1

izipを使用する際のあなたの評価は正しいですが、それを使用する方法は完全に正しくありません

あなたは最初にする必要があります

  • タプル(キー、値)のリストとしてアイテムを取得します(iteritems()Py2.xを使用している場合、またはPy3.xを使用している場合はメソッドをitems()使用します)
  • キーと値の内積を作成します
  • リストをフラット化します(itertools.chainを使用)
  • zip形式で圧縮します(itertools.izipを使用)
  • 次に、各要素のdictを作成します

これがサンプルコードです

>>> from pprint import PrettyPrinter
>>> pp = PrettyPrinter(indent = 4)
>>> pp.pprint(map(dict, izip(*chain((product([k], v) for k, v in data.items())))))
[   {   'one': 'a', 'three': 't', 'two': 'q'},
    {   'one': 'b', 'three': 'u', 'two': 'w'},
    {   'one': 'c', 'three': 'y', 'two': 'e'}]
>>> 
于 2013-01-24T17:29:00.280 に答える