2013-02-16 139 views
0

我意识到这是一个基本问题,但我无法得到它的工作。 我有以下元组:在Python中的元组中使用相同的元素合并元组

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

我想在t每个元组中是唯一的,且合并的每一第二项一起复制到字典中的第一个项目。

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

毫不奇怪,这不起作用:

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

这是结果:

{'apple': 'apple', 'banana': 'carrot'} 
+1

你确定你真的需要,而不是字典嵌套的元组在这里? – 2013-02-16 22:04:49

+0

我想字典会更好,你是对的 – user1185790 2013-02-16 22:08:23

回答

2

我想,你应该使用dict这里(或者更确切地说,defaultdict) 。其中dictkey将是您内部元组的第一个元素 - 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',)} 
+0

defaultdict - 很高兴知道。 Rohit赢得胜利! – user1185790 2013-02-16 22:26:47

+0

@ user1185790。 :) – 2013-02-16 22:27:31

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')]

+1

根据Rohit的推荐,我觉得字典会更可取。这个解决方案工作,但我想一个元组不是我在找什么。谢谢克里斯! – user1185790 2013-02-16 22:28:20

+0

不客气。 – 2013-02-16 22:29:18

+0

请注意,匿名元组参数(例如insert中的'(k,v)')在Python 3中不再允许。您可能需要使用两个单独的参数'k'和'​​v'或匹配一个组合元组的名称,然后手动解包。另外,你可以简化'else'到'd [k] +(v,)'(不需要使用列表进行连接)。 – Blckknght 2013-02-16 22:30:19

1

类型的字典的setdefault方法派上用场的情况是这样的:

t = (('apple', 'banana'), ('apple', 'carrot'), ('banana', 'carrot')) 
d = {} 
[d.setdefault(k,[]).append(v) for k,v in t] 
+0

真棒紧的小代码 – 2013-02-16 22:37:02

相关问题