0

これは基本的な質問だと思いますが、これを機能させることはできません。次のタプルがあります。

t = (('apple', 'banana'), ('apple', 'carrot'), ('banana', 'carrot'))

すべてのタプル内の最初の項目をt一意にし、すべての重複の 2 番目の項目を辞書にマージしたいと考えています。

t = {('apple': 'banana', 'carrot'), ('banana': 'carrot')}

当然のことながら、これは機能しません:

t = dict(zip(set(t[0]),t[1]))

結果は次のとおりです。

{'apple': 'apple', 'banana': 'carrot'}
4

3 に答える 3

3

dictここで a (または a )を使用する必要があると思いますdefaultdict。のどこkeydictあなたの内部タプルの最初の要素になるでしょう - tup[0].

これはあなたが望むものです:

>>> t = (('apple', 'banana'), ('apple', 'carrot'), ('banana', 'carrot'))
>>>
>>> from collections import defaultdict
>>> 
>>> temp_dict = defaultdict(tuple)
>>> 
>>> for tup in t:
        temp_dict[tup[0]] += tup[1:]  


>>> temp_dict
defaultdict(<type 'tuple'>, {'apple': ('banana', 'carrot'), 'banana': ('carrot',)})

>>> {key:value for key, value in temp_dict.items()}
{'apple': ('banana', 'carrot'), 'banana': ('carrot',)}
于 2013-02-16T22:10:10.920 に答える
1

完全な解決策は次のとおりです(編集:Python 3と互換性があります

import functools
t = (('apple', 'banana'), ('apple', 'carrot'), ('banana', 'carrot'))

def insert(d,k,v):
        d[k] = (v,) if k not in d else d[k]+(v,)
        return d

z = functools.reduce(lambda d,ti: insert(d,*ti),t,{})

def flat(tpl):
        return sum([(x,) if not isinstance(x,tuple) else x for x in tpl],())

result = [flat(x) for x in z.items()]

収量:

[('apple', 'banana', 'carrot'), ('banana', 'carrot')]

于 2013-02-16T22:20:30.557 に答える
1

setdefaultdictsの方法は、次のような場合に役立ちます。

t = (('apple', 'banana'), ('apple', 'carrot'), ('banana', 'carrot'))
d = {}
[d.setdefault(k,[]).append(v) for k,v in t]
于 2013-02-16T22:36:16.303 に答える