使元组序列对于特定元素是唯一的



所以我有一个元组

a = ((1, 2), (7, 2), (5, 2), (3, 4), (8, 4))

我想从"a"中删除所有具有公共第二个元素的元组,除了一个(它们中的任何一个(。

对于上面的例子,我想要新的输出a = ((1,2),(3,4))

换句话说,我想消除元组,这些元组在元组的第二个位置被认为是重复元素。

我想知道实现这一点的最有效方法,也想知道我是否可以用列表而不是元组来做同样的事情?

您可以从元素中创建一个字典,使用任何您想要唯一的元素作为键,然后提取值。这适用于"唯一"子元素可哈希的任何内容。整数是可散列的:

def unique_by_key(elements, key=None):
    if key is None:
        # no key: the whole element must be unique
        key = lambda e: e
    return {key(el): el for el in elements}.values()

这个函数非常通用;它可以用于提取任何特征的"唯一"元素,只要key可调用返回的任何内容都可以用作字典中的键即可。订单将不会被保留,目前每个键的最后一个元素获胜。

使用上面的函数,您可以使用operator.itemgetter()对象或lambda从每个元素中提取第二个值。这对元组序列和列表序列都有效:

from operator import itemgetter
unique_by_second_element = unique_by_key(a, key=itemgetter(1))

演示:

>>> from operator import itemgetter
>>> a = ((1, 2), (7, 2), (5, 2), (3, 4), (8, 4))
>>> unique_by_key(a, key=itemgetter(1))
[(5, 2), (8, 4)]
>>> b = [[1, 2], [7, 2], [5, 2], [3, 4], [8, 4]]
>>> unique_by_key(b, key=itemgetter(1))
[[5, 2], [8, 4]]

请注意,函数总是返回一个列表;您总是可以通过对结果调用tuple()来将其转换回来。

最新更新