5

タプルを変換する方法:

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

辞書に:

{'1':('a','A'),'2':('b','B'),'3':('c','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'

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

JP

PS変換を行うためのより良い方法はありますか?

4

6 に答える 6

6

collections モジュールから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    
于 2012-09-27T11:39:26.143 に答える
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')}
于 2012-09-27T11:39:00.220 に答える
1

非常にクリーンでエレガントなオプションは、次のことです。

>>> 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']}
于 2012-09-27T12:48:04.237 に答える
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']}
于 2012-09-27T11:39:12.057 に答える
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']}

またはセット内包表記の副作用 (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']}

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

于 2012-09-27T13:16:13.777 に答える
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']}
于 2012-09-27T11:47:28.953 に答える