2017-08-03 4 views
3

、私は私のような何かを達成したいと思い、このPythonの配列は、だから、

query_results = [("foo", "bar"), ("foo", "qux"), ("baz", "foo")] 

のようなタプル何かの配列を持つ2号店この

from itertools import groupby 

grouped_results = {} 
for key, y in groupby(query_results, lambda x: x[0]): 
    grouped_results[key] = [y[1] for u in list(y)] 

キーの数が正しいが、私が持っている問題は、各アレイ内の値の数は、DRAMでありますそれは必然的に低くなるはずです。なぜこのようなことが起き、何をすべきか説明できる人

+0

これ: '[yのUためのU [1] [リスト内のuのためにY [1](Y)]' 'であるべきである' –

+0

また、ノート'itertools.groupby'は次のように動作します:' [k for k、groupbyのg( 'AAAABBBCCDAABBB')] - > ABCDAB' –

答えて

5

方が良いこのためdefaultdictを使用します生み出す

from collections import defaultdict 

result = defaultdict(list) 

for k,v in query_results: 
    result[k].append(v) 

>>> result 
defaultdict(<class 'list'>, {'baz': ['foo'], 'foo': ['bar', 'qux']}) 

あなたは辞書再びバニラにそれを回すしたい場合は、することができます - forループの後 - 用途:

result = dict(result) 

これは、その後に結果:

>>> dict(result) 
{'baz': ['foo'], 'foo': ['bar', 'qux']} 

defaultdictはここlist工場で構成されています。キーが辞書に見つからない場合は、ファクトリが呼び出されます(list()は新しい空のリストを作成します)。結果はキーに関連付けられます。

したがって、まだ辞書に入っていない各キーkについては、まず新しいリストを作成します。そのリストに.append(v)と名前をつけて値を追加します。

+0

単純な辞書を使わないのはなぜですか? –

+2

@SamChats:よりエレガントで、リストの代わりにセットを使用したい場合など、簡単に変更できるためです。あなたのコードはすぐに省略された空のリストをたくさん作ります。さらに、 '+'は* O(n)*で動作し、アルゴリズムを* O(n^2)*にします。 –

+0

説明をありがとう。私のコードが拡大するかどうかは疑問だった。そして、あなたは '+'がO(n)で動作し、 'append'がO(n^2)で動作することを意味しますか? –

1

defaultdictはどうですか?

d = defaultdict(list) 
for pair in query_results: 
    d[pair[0]].append(pair[1]) 
+0

しかし、私は 'key、value'を使う方が' pair 'を 'pair [0]'と 'pair [1]'で使う方が良いと思います。 –

+0

あなたが正しいです - それはより読みやすくなります –

2

なぜ単純なforループを使用しないのですか?

grouped_results = {} 
for key, value in query_results: 
    grouped_results.setdefault(key, []).append(value) 

出力:

{'foo': ['bar', 'qux'], 'baz': ['foo']} 
+1

@ juanpa.arrivillagaありがとう!私は自分のコードを編集しました。しかし、私は 'defaultdict'を追加していないので、私の答えは冗長になります。 –

関連する問題