删除列表中的重复项

2023-11-25

如何检查列表是否有重复项并返回没有重复项的新列表?


获取唯一项目集合的常见方法是使用set。套装有无序的的集合distinct对象。要从任何可迭代对象创建集合,您只需将其传递给内置的set()功能。如果您稍后再次需要一个真实的列表,您可以类似地将集合传递给list()功能。

以下示例应涵盖您尝试执行的任何操作:

>>> t = [1, 2, 3, 1, 2, 3, 5, 6, 7, 8]
>>> list(set(t))
[1, 2, 3, 5, 6, 7, 8]
>>> s = [1, 2, 3]
>>> list(set(t) - set(s))
[8, 5, 6, 7]

从示例结果中可以看出,不维持原来的顺序。如上所述,集合本身是无序集合,因此顺序会丢失。将集合转换回列表时,会创建任意顺序。

维持秩序

如果顺序对您很重要,那么您将不得不使用不同的机制。一个非常常见的解决方案是依赖OrderedDict在插入过程中保持键的顺序:

>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]

从 Python 3.7 开始,内置字典也保证保持插入顺序,因此如果您使用的是 Python 3.7 或更高版本(或 CPython 3.6),您也可以直接使用它:

>>> list(dict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]

请注意,这可能会产生一些开销,首先创建字典,然后从中创建列表。如果您实际上不需要保留顺序,那么通常最好使用集合,特别是因为它为您提供了更多的操作可供使用。查看这个问题了解更多详细信息以及删除重复项时保留顺序的替代方法。


最后请注意,两者set以及OrderedDict/dict解决方案要求您的物品是hashable。这通常意味着它们必须是不可变的。如果您必须处理不可散列的项目(例如列表对象),那么您将不得不使用一种缓慢的方法,在这种方法中您基本上必须将嵌套循环中的每个项目与每个其他项目进行比较。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除列表中的重复项 的相关文章

随机推荐

  • Eclipse 终止键盘快捷键

    How do I get eclipse to terminate I use the keyboard shortcut Ctrl F11 to run a program and I cannot enable the terminat
  • Expo 构建 EAS - 本地 - 未找到 SDK 位置

    当我使用来自博览会的新构建工具时EAS在本地构建我的 React Native 应用程序 eas build platform android local 我收到一个错误 未找到 SDK 位置 使用 ANDROID SDK ROOT 定义位
  • 给定一组点,如何找到彼此最远的两个点? [复制]

    这个问题在这里已经有答案了 可能的重复 最大线性尺寸二维点集 我可以计算每个点之间的距离并取最大的距离 但是当有大量 gt 1000 点时 这听起来不是一种非常有效的方法 注意 这是针对 iPhone 的 所以我没有太多的处理能力 为什么不
  • 如果没有堆内存,如何释放 std::vector

    我有一个这样的类成员变量 vector
  • 在 Microsoft Outlook 中使用 applescript 创建新的外发邮件

    我正在尝试使用 Microsoft Outlook 2011 for mac 创建新的外发邮件 使用AppleScript 以下示例适用于10 6 8 tell application Microsoft Outlook set newMe
  • 数据库大小计算?

    估计具有以下特征的数据库有多大的最准确方法是什么 MySQL 1 Table with three columns id gt 大整型 字段1 gt varchar 32 字段2 gt 字符 32 field2 上有一个索引 您可以假设 v
  • 在 bash 中创建 RS256 JWT

    我正在尝试仅使用 bash 和 openSSL 构建 RS256 JWT 令牌 我可以使用的开发工具有限 我设计了一个脚本 它从 txt 文件中获取标头和有效负载 去掉换行符等 base 64URL 对它们进行编码并用 将它们连接在一起 分
  • Mongoose .update() 不会触发验证检查

    我可以设置超出枚举数组的值 但我不知道为什么猫鼬不验证该值 我是否以错误的方式更新枚举 my code var OrderSchema new mongoose Schema status type String enum created
  • 如何在Python 3中将具有属性的对象转换为不带“_”的JSON?

    我想将 Python 对象转换为 JSON 格式 类的私有属性User使用属性定义 方法to Json 我已经发现here class User def init self self name None self gender None p
  • 使用 Java 以编程方式确定 2 个图像是否看起来相同 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 在JAVA中 我试图以编程方式判断两个图像在屏幕上显示时是否相等 又名相同的图像 即使它们具有不同的值 色彩空间 是否有一段代码在呈现 2 个图像时会返回布尔值 我的示例之一是将
  • 如何使 Swig 正确包装在 C 中修改为 Java Something-or-other 的 char* 缓冲区?

    我正在尝试包装一些遗留代码以便在 Java 中使用 我很高兴看到 Swig 能够处理头文件 并且它生成了一个几乎可以工作的出色包装器 现在我正在寻找让它真正发挥作用的深层魔力 在 C 中我有一个看起来像这样的函数 DLL IMPORT in
  • QString 仅替换第一次出现的位置

    有没有简单的方法可以仅用 QString 中的其他子字符串替换某些子字符串的第一次出现 它可以在任何位置 你可以试试这个 QString str this is a string The initial string QString sub
  • 测试嵌套 JavaScript 对象键是否存在

    如果我有一个对象的引用 var test 可能 但不是立即 有嵌套对象 例如 level1 level2 level3 level3 检查深层嵌套对象中是否存在属性的最佳方法是什么 alert test level1 yields unde
  • canvas.toDataURL 不会产生图像/jpeg 数据

    我正在尝试使用 base64 PhoneGap 2 5 将 html5 画布数据保存到服务器 平台 Windows Phone 7 和 8 Android 和 IOS 图像调整大小的基本需求是在通过服务器发送之前优化数据 我遇到了 andr
  • 访问静态成员变量

    我可以使用点表示法访问类的静态成员变量还是应该坚持使用双冒号的访问运算符 如果您有实例变量 则可以使用点运算符来访问静态成员 如果可以访问 include
  • 有没有办法在 C# 中只设置一次属性

    我正在寻找一种方法来允许 C 对象中的属性仅设置一次 编写代码来执行此操作很容易 但我宁愿使用标准机制 如果存在 public OneShot
  • 在 .NET Core 3.0 中从 C# 执行提升的 powershell 脚本

    我正在从 C 代码调用自提升的 powershell 脚本 该脚本重置 DNS 设置 当从未提升的 powershell 调用时 该脚本工作正常 但从 C 代码调用时则不起作用且不会引发异常 我的执行策略暂时设置为不受限制 并且我正在以管理
  • 模态加载 angularjs ui bootstrap 后调用函数

    我在用Angularjs UI bootstrap在我的项目中渲染模态窗口 但在某些情况下 我想在模态加载后调用一个函数 我尝试过 timeout and viewContentLoaded但没有用 任何人都可以帮我解决这个问题 谢谢你们
  • 在做函数指针时,使用取址运算符与不使用它的目的是什么?

    对于以下代码片段 为什么我要使用一个作业而不是另一个作业 谢谢 void addOne int x x 1 void inc int x addOne what is the purpose of doing addOne void inc
  • 删除列表中的重复项

    如何检查列表是否有重复项并返回没有重复项的新列表 获取唯一项目集合的常见方法是使用set 套装有无序的的集合distinct对象 要从任何可迭代对象创建集合 您只需将其传递给内置的set 功能 如果您稍后再次需要一个真实的列表 您可以类似地