当前位置: 首页 > 面试题库 >

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

祁修诚
2023-03-14
问题内容

所以我有一个元组

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



 类似资料:
  • 问题 你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列 解决方案 最简单的过滤序列元素的方法就是使用列表推导。比如: >>> mylist = [1, 4, -5, 10, -7, 2, 3, -1] >>> [n for n in mylist if n > 0] [1, 4, 10, 2, 3] >>> [n for n in mylist if n < 0] [-5, -7,

  • 有没有一个Jackson注释允许将数组反序列化到我的POJO的特定字段中?我可以用自定义的反序列化器很容易地做到这一点,但我希望用类内联的方式来完成。 例如,我从Elasticsearch返回了以下JSON。 我的POJO如下: 我希望“排序”数组(在数组[0]中总是有一个long,在数组[1]中总是有一个String)被反序列化如下: 我发现了另一个问题,唯一的答案是自定义的反序列化器,如果可以

  • 我有一个类项目,它使用一个字符作为标识符。 我希望能够检索由类表示的路径,它包含的简单有序列表: 为了存储和管理我的项目和路径,我使用了一个专用类。它包含两个,其中包含每种类型。我可以使用任务的标识符检索任务。 null 更新/注意:我正在寻找通过项目集构建路径

  • 当我运行此代码时: 我收到以下错误: org.openqa.selenium.InvalidSelectorException:无法计算xpath表达式'//输入[包含(@id,'name']'要留档此错误,请访问:http://seleniumhq.org/exceptions/invalid_selector_exception.html构建信息:版本:'2.20.0',修订版:'16008'

  • 问题内容: 给定下面的数组,我想知道是否有一种简单的方法可以将此数组转换为仅具有唯一值的数组? 给出: 将其变成这样的结果数组,保留原始顺序: 问题答案: 在Java 8中,用于获取数组的唯一元素 最简单的方法是从数组创建集合。 然后您可以使用以下方法检索数组: 如果要维护订单,请使用 LinkedHashSet; 如果要对订单进行排序,请使用 TreeSet 。

  • 问题内容: 我想从这些数据结构中按值删除满足某些条件的元素 从上一个问题中,我找到了使用的简洁答案,但是似乎需要精确匹配。 在这里,我想从表或映射中删除其值小于特定阈值的元素。您编写代码的方式是什么? 我只检查了两个答案,这些是关于map的答案,表情况如何?我的解决方案如下。 问题答案: Iterator iterator = hmap.values().iterator(); while (it