如何根据原始元组列表中的值创建新的元组列表?

时间:2015-08-06 16:52:33

标签: python python-3.x tuples

我的功能目前正在返回:

[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'e', 'f'), ('h', 'b', 'c')]

但是,我需要最终输出为:

[('a', 'h'), ('d', 'g')]

如你所见,如果我[1]和我[2]匹配,我需要i [0]配对。

我试图使用for循环,但此刻我无法想到如何编写它。

5 个答案:

答案 0 :(得分:2)

这似乎有效:

from itertools import combinations

l = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'e', 'f'), ('h', 'b', 'c')]
print([(a[0], b[0]) for a, b in combinations(l, 2) if a[1:] == b[1:]])

答案 1 :(得分:1)

基于每个元组的第二个和第三个元素的组,将第一个元素附加到列表然后过滤掉长度<1的列表。 1:

from collections import defaultdict

d = defaultdict(list)
for a,b,c in l:
    d[b,c].append(a)

print([tuple(val) for val in d.values() if len(val)>1])
[('a', 'h'), ('d', 'g')]

要保证首次匹配订单,请使用OrderedDict:

from collections import OrderedDict
d = OrderedDict()
for a,b,c in l:
    d.setdefault((b,c),[]).append(a)

print([tuple(val) for val in d.values() if len(val)>1])

答案 2 :(得分:1)

您可以通过基于第二个和第三个元素对列表进行排序,然后使用itertools.groupby来完成此操作。然后,对于每个组,您可以从其中的元素中获取第一个元素。示例 -

w

这也可以在一行中完成(虽然不可读) -

>>> a = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'e', 'f'), ('h', 'b', 'c')]
>>> lst = []
>>> new_a = sorted(a, key=lambda i: (i[1], i[2]))
>>> for _, x in itertools.groupby(new_a, lambda i: (i[1], i[2])):
...     lst.append(tuple(y[0] for y in x))
...
>>> lst
[('a', 'h'), ('d', 'g')]

答案 3 :(得分:1)

我认为此解决方案将保留订单(基于初始匹配位置):

from itertools import groupby
from operator import itemgetter
from collections import defaultdict

x = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'e', 'f'), ('h', 'b', 'c')]
groupings, seen_list=defaultdict(list), []

for key, value in groupby(x, itemgetter(1, 2)):
    if key not in seen_list:
         seen_list.append(key)
    groupings[key].extend(list(map(itemgetter(0),value)))

print([groupings[key] for key in seen_list])

如果订单不重要,您可以忽略seen_list并只打印groupings.values()

x = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'e', 'f'), ('h', 'b', 'c')]
groupings=defaultdict(list)
for key, value in groupby(x, itemgetter(1, 2)):
    groupings[key].extend(list(map(itemgetter(0),value)))

print(groupings.values())

答案 4 :(得分:0)

可能不是那么pythonic,但有点容易:

>>> a = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'e', 'f'), ('h', 'b', 'c')]    
>>> c = {}
>>> [c[j+k].append(i) if j+k in c else c.update({j+k:[i]}) for i,j,k in a]
>>> c = c.values()
>>> print c
[['d', 'g'], ['a', 'h']]