消除冗余元组

2024-04-19 12:30:50 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个元组列表,其中每个元组代表变量ab和{},我如何消除冗余元组?在

冗余元组是那些ab简单互换的元组,但是c是相同的。对于这个例子:

tups = [(30, 40, 50), (40, 30, 50), (20, 48, 52), (48, 20, 52)]

我的最终列表应该只包含一半的条目。一种可能的输出:

^{pr2}$

另一个

tups = [(40, 30, 50), (20, 48, 52)]

等等

有没有一种简单的Python式的方法?在

我尝试过使用集合,但是(30, 40, 50)(40, 30, 50)不同,但对我来说,这些都是多余的,我只想保留其中一个(哪一个无关紧要,但如果我可以选择的话,我更喜欢从低值到高值的顺序)。如果有办法对元组的前2个元素进行排序,那么使用集合就可以了。在

我确信我可以想出一个可行的解决方案(也许把元组转换成列表作为中间步骤),但我只想看看是否有一种简单明了的方法可以做到这一点,但我并不熟悉。在

附言:这个问题的部分动机是PE #39。但即使撇开这个体育问题,我现在只是好奇,这是如何容易做到的(或如果)。在

编辑

只是为了给那些不熟悉PE的人提供一些上下文,ab,和{}代表直角三角形的边,所以我检查一下{},显然{}和{}的顺序是否无关紧要。在


Tags: 方法元素列表排序顺序条目代表例子
3条回答
set([(a,b,c) if a<b else (b,a,c) for a,b,c in tups])

从您的问题来看,元组的前两个元素似乎构成了元组中的一个子单元。因此,将数据重组为元组和第三个数字的元组似乎是有意义的,其中第一个元组是排序顺序的前两个数字。然后您可以自然地使用集合:

>>> newTups = [(tuple(sorted([a, b])), c) for a, b, c in tups]
>>> newTups
[((30, 40), 50), ((30, 40), 50), ((20, 48), 52), ((20, 48), 52)]
>>> set(newTups)
set([((20, 48), 52), ((30, 40), 50)])
tups = [(30, 40, 50), (40, 30, 50), (20, 48, 52), (48, 20, 52)] 
no_duplicates = list(set(tuple(sorted(tup)) for tup in tups))

当然,这是假设每个元组的第三个元素始终是每个元组中最大的元素,否则,请执行以下操作:

^{pr2}$

正如WolframH所建议的,表达式tuple(sorted(tup[:2])) + (tup[2],)可以写成tuple(sorted(tup[:2])) + tup[2:],这是有利的,因为它可以被推广到tuple(sorted(tup[:i])) + tup[i:],其中{}可以是任何想要将排序的元素与未排序的元素分离的点。在

相关问题 更多 >