2012-09-27 7 views
5

:辞書にタプル:タプルを変換する方法1つのキーと複数の値

t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 

私はコンソールで試してみました:

>>> d={} 
>>> t[0] 
(1, 'a') 
>>> d[t[0][0]]=t[0][1] 
>>> d 
{1: 'a'} 
>>> t[0][0] in d 
True 
>>> d[t[1][0]]=t[1][1] 
>>> d 
{1: 'A'} 
>>> d[t[0][0]]=t[0][1] 
>>> d[t[1][0]]=d[t[1][0]],t[1][1] 
>>> d 
{1: ('a', 'A')} 

次のスクリプトは失敗します。

t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 
print "{'1':('a','A'),'2':('b','B'),'3':('c','C')} wanted, not:",dict(t) 
d={} 

for c, ob in enumerate(t): 
    print c,ob[0], ob[1] 
    if ob[0] in d: 
     print 'test' 
     d[ob[0]]=d[ob[0]],ob[1] 
     print d 

    else: 
     print 'else', d, ob[0],ob[1] 
     d[ob[0]]=d[ob[1]]   # Errror is here 
     print d 
print d 

私はエラーを持っている:

Traceback (most recent call last): 
    File "/home/simon/ProjetPython/python general/tuple_vers_dic_pbkey.py", line 20, in <module> 
    d[ob[0]]=d[ob[1]] 
KeyError: 'a' 

[1] $ [0] $ >>> D [T [0] [0] = tから異なるようです。 ご協力いただきありがとうござい

JP

PS convertionを行うには良い方法はありますか?

+0

'{'1' :('a'、 'A')...'値としてリストの代わりにタプルを持つことは重要ですか? –

+0

申し訳ありませんが、エラーが表示されます:d [ob [0]] = ob [1] d [ob [0]] = d [ob [1]] –

+0

@Waleed Khan:も元気。 –

答えて

3
import itertools as it 
t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 

{k:tuple(x[1] for x in v) for k,v in it.groupby(sorted(t), key=lambda x: x[0])} 

戻り

{'1': ('A', 'a'), '2': ('B', 'b'), '3': ('C', 'c')} 
+0

これはPython 2.7以降でのみ有効です。 – John

1
t = (('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 
foo = {} 
for i in t: 
    if i[0] not in foo: 
     foo[i[0]] = [i[1]] 
    else: 
     foo[i[0]].append(i[1]) 
foo # {'3': ['c', 'C'], '2': ['b', 'B'], '1': ['a', 'A']} 
6

あなたは、コレクションモジュールからdefaultdictを使用することができます(それはリストのためのより良い動作しますが、ないタプル):

t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 

from collections import defaultdict 
d = defaultdict(list) 
for k, v in t: 
    d[k].append(v) 

d = {k:tuple(v) for k, v in d.items()} 
print d 

または単にタプルを追加一緒に:

t = (('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 
d = {} 
for k, v in t: 
    d[k] = d.get(k,()) + (v,) 
print d  
0
>>> t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 
>>> d1 = {} 
>>> for each_tuple in t: 
    if each_tuple[0] in d1: 
     d1[each_tuple[0]] = d1[each_tuple[0]] + list(each_tuple[1]) 
    else: 
     d1[each_tuple[0]] = list(each_tuple[1]) 

>>> d1 
{'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']} 
1

Aスーパークリーンでエレガントなオプションは、次の操作を実行するために、次のようになります。

>>> d = {} 
>>> for k,v in (('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')): 
...  d.setdefault(k, []).append(v) 
... 
>>> d 
{'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']} 
+0

リストにはなくタプルが必要であることに注意してください。 – georg

0

完全なものにするには、1行でこれを行うには、リスト内包表記の副作用を使用することができます。

>>> tups=t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')) 
>>> d={} 
>>> [d.setdefault(k,[]).append(v) for k,v in tups] 
[None, None, None, None, None, None] 
>>> d 
{'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']} 

またはSET理解(PY 2.7以降または3.1以上)の副作用:

>>> d={} 
>>> {d.setdefault(k,[]).append(v) for k,v in tups} 
set([None]) 
>>> d 
{'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']} 

これは興味深いものですが、推奨構文ではありませんが、興味深いです。

関連する問題