python - 使特定元素唯一的元组序列

标签 python set tuples

所以我有一个元组的元组

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() object或 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() 将其转换回来。

关于python - 使特定元素唯一的元组序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31499259/

相关文章:

c# - 如何在C#中模拟元组和集合?

python - 如何从 pandas 中的列创建唯一 ID 列表,其中 ID 列表在 Python 中被称为字符串

python - python类中的声明等同于_init_?

haskell - Haskell 有严格的 Set 容器吗?

c++ set<> 类对象。使用自己的比较器给出来自功能、xtree 等的 JUNK 错误

python - 生成元组列表并使用它

python - 使用 python 访问 csv 文件中的各个单元格

python - 为什么我的 A* 搜索返回与 UniformCostSearch 相同的扩展空间?

jquery - 如何使用 jQuery 设置文本标签?

python - 为什么不为 "in"操作设置文字 O(1)?