我有2个元素的元组列表:
[(7, 3), (4, 3), (5, 3), (6, 3), (0, 1), (1, 1), (2, 1), (3, 1)]
我想将它转换为另一个元组列表。每个列表包含第一个列表中具有相同第二个索引的元素。
所以在这种情况下结果应该是:
[(7, 4, 5, 6), (0, 1, 2, 3)]
因为7,4,5和6与3配对,而0,1,2,3与1配对。
我的尝试是这样做的:
x = list(map(operator.itemgetter(0),sorted_countries))
但我仍然不知道如何分组,因为我的结果是:
[7, 4, 5, 6, 0, 1, 2, 3]
答案 0 :(得分:1)
根据您的使用案例,此解决方案可能过于概括,但应适用于所有情况(即初始元组未按其第二个元素分组)。你需要OrderedDict
。如果您想避免setdefault
,则需要ordered defaultdict。
>>> from collections import OrderedDict
>>> l = [(7, 3), (4, 3), (5, 3), (6, 3), (0, 1), (1, 1), (2, 1), (3, 1)]
>>>
>>> second2first = OrderedDict()
>>> for first, second in l:
... second2first.setdefault(second, []).append(first)
...
>>> result = [tuple(v) for v in second2first.values()]
>>> result
[(7, 4, 5, 6), (0, 1, 2, 3)]
我们的想法是获取原始元组的所有第一个值,并根据第一个值配对的第二个元素将它们附加到不同的列表中。 OrderedDict
由元组的第一个元素编制索引,用于跟踪列表的创建顺序。
之后,我们只提取值(列表)并将它们转换为元组。
答案 1 :(得分:1)
看看itertools.groupby()。这可以为你做分组。
注意:输入必须按组密钥排序。
示例,获得所需的输出:
import itertools
test=[(7, 3), (4, 3), (5, 3), (6, 3), (0, 1), (1, 1), (2, 1), (3, 1), (7, 3), (4, 3)]
groups = []
test.sort(key=lambda x:x[1])
for _, group in itertools.groupby(test, key=lambda x:x[1]):
groups.append(tuple(elem for elem, _ in group))
print(groups)
正如Jon Clements建议的那样,所有这些都可以在一行中使用嵌套列表推导来完成:
groups = [tuple(el[0] for el in g) for k, g in itertools.groupby(sorted(test, key=lambda L: L[1]), key=lambda L: L[1])]
答案 2 :(得分:0)
lt = [(7, 3), (4, 3), (5, 3), (6, 3), (0, 1), (1, 1), (2, 1), (3, 1)]
lt_part1 = lt[0:len(lt)//2] #[(7, 3), (4, 3), (5, 3), (6, 3)]
list1 = []
list2 = []
list1.append( tuple([t[0]for t in lt_part1]) )
list2.append( tuple([t[1]for t in lt_part1]) )
print(list1)
print(list2)
<强>结果:强>
[(7, 4, 5, 6)]
[(3, 3, 3, 3)]
答案 3 :(得分:0)
此时我无法获得内联解决方案...如果您需要解决方案而不是清除一个内线答案,希望代码段很有用..
tupleList = [(7, 3), (4, 3), (5, 3), (6, 3), (0, 1), (1, 1), (2, 1), (3, 1)]
ex_dict = {}
for (x,y) in tupleList:
try:
if(ex_dict[y]):
ex_dict[y] = ex_dict[y]+(x,)
except:
ex_dict[y]= (x,)
ex_list = list(ex_dict[x] for x in ex_dict)
print(ex_list)