2014-11-23 82 views
1

我有一个列表,其中包含每个条目的两个索引以及一个值。每个元组中的前两个元素分别是表中的行和列。第三项是细胞的价值。合并具有相同键的两个元组

我想合并每个相同的单元格的值。下面是数据结构的例子:

[ 
    (1, 2, 'R'), 
    (1, 3, 'S'), 
    (1, 2, 'S'), 
    (2, 3, 'S'), 
] 

我需要合并相匹配的行/列对项目是这样的:

[ 
    (1, 2, 'RS'), 
    (1, 3, 'S'), 
    (2, 3, 'S'), 
] 

或:

[ 
    (1, 2, ('R', 'S')), 
    (1, 3, ('S',)), 
    (2, 3, ('S',)), 
] 
+0

for mem误码率在myList中: 出= []在范围(0,LEN(myList中)) 对于i: 在范围Ĵ(0,LEN(myList中)): 如果(构件[0] .myList [I ]成员[0] .myList [j])和(member [1] .myList [i] == member [1] .mylist [j]): newlist = [(member [0],member [1 ],(member [2] .myList [i],member [2] .myList [j]))] out.append [newlist] else: out。追加(成员) print(out) #我是非常基本的蟒蛇,probaly我有这个代码很多问题。我会感谢您的帮助 – Mahesh 2014-11-23 20:15:40

回答

1

这里的东西应该工作。如果您使用的是Python 3,请将.iteritems()方法调用更改为.items()(它已经是该版本Python中的迭代器)。

from collections import defaultdict 

def merge_final_values(values): 
    mergeddict = defaultdict(list) 
    for group in values: 
     mergeddict[group[:-1]].append(group[-1]) 
    return [(k + (tuple(v),) if len(v) > 1 else k + tuple(v)) 
       for k, v in mergeddict.iteritems()] 

test = [(1, 2, 'R'), (1, 3, 'S'), (1, 2, 'S'), (2, 3, 'S')] 

print(merge_final_values(test)) 

输出:

[(1, 2, ('R', 'S')), (1, 3, 'S'), (2, 3, 'S')] 

,如果你想连接成一个字符串合并值,只是改变了功能的返回值:

return [(k + (''.join(v),)) for k, v in mergeddict.iteritems()] 

,你会得到这个输出代替:

[(1, 2, 'RS'), (1, 3, 'S'), (2, 3, 'S')] 
+0

非常感谢。注意:dict.iteritems()在python 3中被替换为dict.items()。 – Mahesh 2014-11-23 21:17:25

2

您可以使用itertools.groupby()

>>> from itertools import groupby 
>>> l = [(1, 2, 'R'), (1, 3, 'S'), (1, 2, 'S'), (2, 3, 'S')] 
>>> g_list=[list(g) for k, g in groupby(sorted(l),lambda x :x[0:2])] 
>>> [(i[0],j[0],k) for i,j,k in [zip(*i) for i in g_list]] 
[(1, 2, ('R', 'S')), (1, 3, ('S',)), (2, 3, ('S',))] 

在这个片段中,我们首先需要与sorted()功能排序,我们的列表之类我们基于这些元素tuplse,所以我们有这样的结果:

>>> sorted(l) 
[(1, 2, 'R'), (1, 2, 'S'), (1, 3, 'S'), (2, 3, 'S')] 

那么我们分组基于第一牵引元素的排序列表(lambda x :x[0:2] ),所以我们将有:

>>> g_list 
[[(1, 2, 'R'), (1, 2, 'S')], [(1, 3, 'S')], [(2, 3, 'S')]] 

所以,现在我们有相同的2第一个元素嵌套列表,现在我们需要保持刚刚1和第二路元素之一,两个(或更多)3TH元素,在这种情况下,我们可以使用zip()函数,它会得到这样的结果:

>>> [zip(*i) for i in g_list] 
[[(1, 1), (2, 2), ('R', 'S')], [(1,), (3,), ('S',)], [(2,), (3,), ('S',)]] 

现在我们需要的是选择第一和第二元组和全3TH elemnt的第0个元素:

(i[0],j[0],k) for i,j,k in ... 
+0

非常感谢!对不起,我的代码是不正确的格式。我当时不知道格式化规则! – Mahesh 2014-11-23 20:34:43

相关问题