通过特定元素使元组序列唯一

发布于 2021-01-29 18:20:04

所以我有一个元组

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

我想从“ a”中删除所有具有共同的第二个元素的元组,但其中一个(其中任何一个)除外。

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

换句话说,我想消除在元组第二位置被视为重复元素的元组。

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

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    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()结果将其转换回去。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看