1

タプルのリストがあります。最初の部分は、繰り返される場合と繰り返されない場合がある識別子です。このリストを識別子でキー設定された辞書に処理したいと思います。問題は、キーによる上書きについて考えることができなかったことです。

def response_items(self):
        ri = self.response_items_listing#(gets the list)          
        response_items = {}
        for k, g in groupby(ri, itemgetter(0)):
            x = list(g)
            l = [(xx[1],xx[2]) for xx in x]
            response_items[k] = l
        return response_items

例:次のようなリスト:

[('123', 'abc', 'def'),('123', 'efg', 'hij'),('456', 'klm','nop')]

として戻ってきます

{123:('efg', 'hij'), 456:('klm', 'nop')}

しかし、私は必要です:

{123:[('abc', 'def'),('efg', 'hij')], 456:('klm', 'nop')}

キーごとにマージ/集約するための手順を実行する必要がありますが、正確にATMが表示されていません。

より良いまたはより効率的なソリューションは何ですか?

4

3 に答える 3

2

あなたが使用することができますsetdefault()

In [79]: dic={}
In [80]: for x in lis:
    dic.setdefault(x[0],[]).append(x[1:])
   ....:     
   ....:     

In [82]: dic
Out[82]: {'123': [('abc', 'def'), ('efg', 'hij')], '456': [('klm', 'nop')]}
于 2012-10-22T16:20:43.340 に答える
2

簡単なアプローチは

from collections import defaultdict

ri = [('123', 'abc', 'def'),('123', 'efg', 'hij'),('456', 'klm','nop')]
response_items = defaultdict(list)
for r in ri:
    response_items[r[0]].append(r[1:])
print response_items

これは

defaultdict(<type 'list'>, {'123': [('abc', 'def'), ('efg', 'hij')],
                            '456': [('klm', 'nop')]})

お望みならば

defaultdict(<type 'list'>, {'123': ['abc', 'def', 'efg', 'hij'],
                            '456': ['klm', 'nop']})

出力として、を使用できますresponse_items[r[0]].extend(r[1:])

于 2012-10-22T16:23:44.823 に答える
1

を使用する理由がある場合は、または方法論itertools.groupbyの使用を避けることができます-[実際、これらのルートをたどりたい場合は、実際にはグループ化は必要ありません!]-by:defaultdictsetdefault

mydict = {}
for k, g in groupby(some_list, itemgetter(0)):
    mydict[k] = [el[1:] for el in g]
于 2012-10-22T16:27:42.207 に答える