通过特定元素创建一系列元组

Bob*_*ack 3 python tuples set

所以我有一个元组元组

a = ((1, 2), (7, 2), (5, 2), (3, 4), (8, 4))
Run Code Online (Sandbox Code Playgroud)

我想从'a'中删除所有具有共同第二个元素的元组,除了一个(其中任何一个).

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

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

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

Mar*_*ers 6

您可以从元素创建一个字典,使用您想要唯一的任何键作为键,然后提取值.这适用于'unique'子元素可以清洗的任何东西.整数是可以清除的:

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()
Run Code Online (Sandbox Code Playgroud)

这个功能非常通用; 它可用于通过任何特征提取"唯一"元素,只要key可调用的返回值可用作字典中的键.订单不会被保留,目前每个键的最后一个元素获胜.

使用上述函数,您可以使用operator.itemgetter()对象或lambda从每个元素中提取第二个值.这适用于一系列元组和一系列列表:

from operator import itemgetter

unique_by_second_element = unique_by_key(a, key=itemgetter(1))
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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]]
Run Code Online (Sandbox Code Playgroud)

请注意,该函数始终返回一个列表 ; 您可以通过调用tuple()结果将其转换回来.