Python中列表和字符串常用的数据去重方法你还记得几个?

Python中列表和字符串常用的数据去重方法你还记得几个?

  • 1 关于数据去重
  • 2 字符串去重
    • 2.1 for方法
    • 2.2 while方法
    • 2.3 列表方法
    • 2.4 直接删除法
    • 2.5 fromkeys方法
  • 3 列表去重
    • 3.1 for方法
    • 3.2 set方法1
    • 3.3 set方法2
    • 3.4 count方法
    • 3.5 转字典法
  • 4 完整代码

1 关于数据去重

  • 关于数据去重,咱们这里简单理解下,就是删除掉重复的数据;
  • 应用的场景比如某些产品产生的大数据,有很多重复的数据,为了不影响分析结果,我们可能需要对这些数据进行去重,删除重复的数据,提高分析效率等等。

2 字符串去重

2.1 for方法

  • 基本思路是for循环先遍历字符串;
  • 遍历的字符要是没在结果字符串中,就添加到结果字符串即可。
  • 代码如下:
import unittestclass TestDeduplication(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.char_date = "12344312abcdcbdaABCDDCBA张王李张"print(f"原始字符串为:{cls.char_date}")@classmethoddef tearDownClass(cls) -> None:passdef test_char_for(self):char_date01 = ""for data in self.char_date:if data not in char_date01:char_date01 += dataprint(f"for方法去重后数据:{char_date01}")if __name__ == "__main__":unittest.main()
  • 结果输出为:
原始字符串为:12344312abcdcbdaABCDDCBA张王李张
for方法去重后数据:1234abcdABCD张王李

2.2 while方法

  • 思路和for差不多;
  • 这里主要是通过通过索引的方式查找;
  • 代码如下:
import unittestclass TestDeduplication(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.char_date = "12344312abcdcbdaABCDDCBA张王李张"print(f"原始字符串为:{cls.char_date}")@classmethoddef tearDownClass(cls) -> None:passdef test_char_while(self):char_date02 = ""flag = len(self.char_date) - 1while True:if flag >= 0:if self.char_date[flag] not in char_date02:char_date02 += self.char_date[flag]flag -= 1else:breakprint(f"while方法去重后数据:{char_date02}")if __name__ == "__main__":unittest.main()
  • 输出结果为:
原始字符串为:12344312abcdcbdaABCDDCBA张王李张
while方法去重后数据:张李王ABCDadbc2134

2.3 列表方法

  • 我们先把字符串转为集合去重;
  • 再将集合转为列表;
  • 将列表转为字符串,最后排序进行输出即可;
  • 部分代码如下,其他关于类的内容和以上一样:
    def test_char_list(self):char_date03 = set(self.char_date)char_date04 = list(char_date03)char_date04.sort(key=self.char_date.index)print(f"列表方法去重后数据:{''.join(char_date04)}")
  • 输出后为:
原始字符串为:12344312abcdcbdaABCDDCBA张王李张
列表方法去重后数据:1234abcdABCD张王李

2.4 直接删除法

  • 这个主要是直接对原字符串直接操作;
  • 通过下标以及字符串切片方法实现;
  • 部分代码如下:
    def test_char_delete(self):for data in self.char_date:if self.char_date[0] in self.char_date[1:len(self.char_date)]:self.char_date = self.char_date[1:len(self.char_date)]else:self.char_date = self.char_date[1:len(self.char_date)] + self.char_date[0]print(f"直接删除方法去重后数据:{''.join(self.char_date)}")
  • 输出为:
原始字符串为:12344312abcdcbdaABCDDCBA张王李张
直接删除方法去重后数据:4312cbdaDCBA王李张

2.5 fromkeys方法

  • 直接使用fromkeys()方法,它的作用是从序列键和值设置为value来创建一个新的字典;
  • 部分代码如下:
    def test_char_fromkeys(self):char_date05 = {}char_date06 = char_date05.fromkeys(self.char_date)list_char = list(char_date06.keys())print(f"fromkeys方法去重后数据:{''.join(list_char)}")
  • 输出为:
原始字符串为:12344312abcdcbdaABCDDCBA张王李张
fromkeys方法去重后数据:1234abcdABCD张王李

3 列表去重

3.1 for方法

  • 循环遍历列表后添加到新的列表即可;
  • 这个方法不会改变原来的顺序;
  • 代码如下:
class TestDeduplication(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.list_data = ["A", "B", "C", "D", "E", "C", "A", "B"]print(f"原始列表为:{cls.list_data}")@classmethoddef tearDownClass(cls) -> None:passdef test_list_for(self):list_data01 = []for data in self.list_data:if data not in list_data01:list_data01.append(data)print(f"for方法:{list_data01} ")if __name__ == "__main__":unittest.main()
  • 输出为:
原始列表为:['A', 'B', 'C', 'D', 'E', 'C', 'A', 'B']
for方法:['A', 'B', 'C', 'D', 'E'] 

3.2 set方法1

  • 直接使用set方法后转为列表即可;
  • 这个方法会改变原来的顺序;
  • 部分代码如下:
 def test_list_set(self):list_data02 = list(set(self.list_data))print(f"set方法1:{list_data02}")
  • 输出为:
原始列表为:['A', 'B', 'C', 'D', 'E', 'C', 'A', 'B']
set方法1['D', 'C', 'B', 'E', 'A']

3.3 set方法2

  • 直接使用set方法后转为列表;
  • 这个方法会改变原来的顺序,可进行排序;
  • 部分代码:
 def test_list_set01(self):list_data03 = list(set(self.list_data))list_data03.sort(key=self.list_data.index)print(f"set方法2:{list_data03}")
  • 输出为:
原始列表为:['A', 'B', 'C', 'D', 'E', 'C', 'A', 'B']
set方法2['A', 'B', 'C', 'D', 'E']

3.4 count方法

  • 先对原序列进行排序;
  • 循环遍历列表后使用count()方法;
  • 部分代码:
    def test_list_count(self):self.list_data.sort()for data in self.list_data:while self.list_data.count(data) > 1:del self.list_data[self.list_data.index(data)]print(f"count方法:{self.list_data}")
  • 输出为:
原始列表为:['A', 'B', 'C', 'D', 'E', 'C', 'A', 'B']
count方法:['A', 'B', 'C', 'D', 'E']

3.5 转字典法

  • 直接把列表转为字典方法即可;
  • 部分代码:
 def test_list_dict(self):list_data04 = {}list_data05 = list_data04.fromkeys(self.list_data).keys()list_data06 = list(list_data05)print(f"字典法:{list_data06}")
  • 输出为:
原始列表为:['A', 'B', 'C', 'D', 'E', 'C', 'A', 'B']
字典法:['A', 'B', 'C', 'D', 'E']

4 完整代码

  • 以下为列表和字符串常用的数据去重方法的完整代码;
  • 使用unittest中的TestCase类组织测试用例;
  • 代码如下:
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/11/22 
# 文件名称:test_deduplication.py
# 作用:字符串和列表去重
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelsonimport unittestclass TestDeduplication(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.char_date = "12344312abcdcbdaABCDDCBA张王李张"cls.list_data = ["A", "B", "C", "D", "E", "C", "A", "B"]print(f"原始字符串为:{cls.char_date}")print(f"原始列表为:{cls.list_data}")@classmethoddef tearDownClass(cls) -> None:passdef test_char_for(self):char_date01 = ""for data in self.char_date:if data not in char_date01:char_date01 += dataprint(f"for方法去重后数据:{char_date01}")def test_char_while(self):char_date02 = ""flag = len(self.char_date) - 1while True:if flag >= 0:if self.char_date[flag] not in char_date02:char_date02 += self.char_date[flag]flag -= 1else:breakprint(f"while方法去重后数据:{char_date02}")def test_char_list(self):char_date03 = set(self.char_date)char_date04 = list(char_date03)char_date04.sort(key=self.char_date.index)print(f"列表方法去重后数据:{''.join(char_date04)}")def test_char_delete(self):for data in self.char_date:if self.char_date[0] in self.char_date[1:len(self.char_date)]:self.char_date = self.char_date[1:len(self.char_date)]else:self.char_date = self.char_date[1:len(self.char_date)] + self.char_date[0]print(f"直接删除方法去重后数据:{''.join(self.char_date)}")def test_char_fromkeys(self):char_date05 = {}char_date06 = char_date05.fromkeys(self.char_date)list_char = list(char_date06.keys())print(f"fromkeys方法去重后数据:{''.join(list_char)}")print("===============================================")def test_list_for(self):list_data01 = []for data in self.list_data:if data not in list_data01:list_data01.append(data)print(f"for方法:{list_data01} ")def test_list_set(self):list_data02 = list(set(self.list_data))print(f"set方法1:{list_data02}")def test_list_set01(self):list_data03 = list(set(self.list_data))list_data03.sort(key=self.list_data.index)print(f"set方法2:{list_data03}")def test_list_count(self):self.list_data.sort()for data in self.list_data:while self.list_data.count(data) > 1:del self.list_data[self.list_data.index(data)]print(f"count方法:{self.list_data}")def test_list_dict(self):list_data04 = {}list_data05 = list_data04.fromkeys(self.list_data).keys()list_data06 = list(list_data05)print(f"字典法:{list_data06}")if __name__ == "__main__":unittest.main()
  • 全部输出为:
===============================================
原始字符串为:12344312abcdcbdaABCDDCBA张王李张
原始列表为:['A', 'B', 'C', 'D', 'E', 'C', 'A', 'B']
直接删除方法去重后数据:4312cbdaDCBA王李张
for方法去重后数据:1234abcdABCD张王李
fromkeys方法去重后数据:1234abcdABCD张王李
列表方法去重后数据:1234abcdABCD张王李
while方法去重后数据:张李王ABCDadbc2134
count方法:['A', 'B', 'C', 'D', 'E']
字典法:['A', 'B', 'C', 'D', 'E']
for方法:['A', 'B', 'C', 'D', 'E'] 
set方法1['B', 'A', 'D', 'C', 'E']
set方法2['A', 'B', 'C', 'D', 'E']
  • 放一张图吧(虽然用处不大,哈哈):
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/209588.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux之进程替换

创建子进程的目的 创建子进程的第一个目的是让子进程执行父进程对应的磁盘代码中的一部分, 第二个目的是让子进程想办法加载磁盘上指定的程序,让子进程执行新的代码和程序 一是让子进程执行父进程代码的一部分, 比如&#xff1a; 1 #include<stdio.h> 2 #include<…

笔记本只使用Linux是什么体验?

笔记本只使用Linux是什么体验&#xff1f; 之后安了Windows双系统之后也不怎么想再进Windows了。 开发环境就不用说了&#xff0c;Linux下配各种开发环境都方便的多&#xff0c;当然你要用 vs 那还是乖乖回 Windows 吧。 最近很多小伙伴找我&#xff0c;说想要一些Linux的资…

德迅云安全-德迅卫士:保障您的主机安全

主机安全是指保证主机在数据存储和处理的保密性、完整性、可用性&#xff0c;包括硬件、固件、系统软件的自身安全&#xff0c;以及一系列附加的安全技术和安全管理措施。 为什么要主机安全&#xff1f; 服务器一旦被黑客入侵&#xff0c;个人和企业面临以下安全风险&#xff…

shell 脚本 批量 修改 文件名

shell 脚本 批量 修改 文件名 原始文件 你可以使用以下的shell脚本来批量修改文件名&#xff1a; #!/bin/bashinput_dir$1if [ -z "$input_dir" ]; thenecho "Usage: ./rename.sh input_directory"exit 1 ficd "$input_dir" || exitfor file in…

python命令行 引导用户填写ssh登录信息

字多不看&#xff0c;直接体验&#xff1a; 待补充 演示代码 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/23 9:20 file: 引导用户填写ssh接口信息.py desc: xxxxxx """# region 引入必要的依赖 impor…

《YOLOv8创新改进》专栏指导书册 手把手创新教程

&#x1f680;&#x1f680;&#x1f680;YOLOv8改进专栏&#xff1a;http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8&#xff0c;从入门到创新&#xff0c;轻轻松松搞定科研&#xff1b; 本专栏为订阅者提供答疑服务&#xff0c;每一篇提供源代码和详细的每一个步骤改进地方。…

TikTok青年领袖:短视频如何塑造新一代

在数字时代的潮流中&#xff0c;短视频平台TikTok崭露头角&#xff0c;成为年轻一代最喜爱的社交媒体之一。这个平台不仅改变了用户的娱乐方式&#xff0c;更在其中催生了一批富有创造力和影响力的青年领袖。 本文将深入探讨TikTok如何通过短视频内容塑造新一代的青年领袖&…

可编程交流回馈式负载箱在电源设备中的应用

可编程交流回馈式负载箱可以用于测试电源设备的输出能力&#xff0c;通过在负载箱中设置不同的负载条件&#xff0c;可以模拟不同的工作负载情况&#xff0c;从而测试电源设备在不同负载下的输出能力和稳定性。这对于电源设备的设计和生产非常重要&#xff0c;可以帮助制造商评…

购买Zoho CRM系统要花多少钱?

相信对CRM系统有过了解的人都知道&#xff0c;CRM系统的价格取决于功能需求&#xff0c;用户数量&#xff0c;部署方式&#xff0c;定制开发等因素。Zoho CRM是全球领先的云CRM系统&#xff0c;自2005年推出以来&#xff0c;累计服务25万企业&#xff0c;那么Zoho CRM系统的价格…

【Java工具篇】Java反编译工具Bytecode Viewer

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

3.7寸墨水屏蓝牙卡证

超薄机身&#xff0c;厚度不足一厘米&#xff0c;轻松佩戴无负重感。 无需基站&#xff0c;服务器&#xff0c;手机APP直接更新~ 独创快速扫描技术&#xff0c;智能感应标签 超长待机&#xff0c;超低功耗&#xff0c;Type C接口充电&#xff0c;一次充电可续航一年&#xf…

python-opencv划痕检测

python-opencv划痕检测 这次实验&#xff0c;我们将对如下图片进行划痕检测&#xff0c;其实这个比较有难度&#xff0c;因为清晰度太差了。 我们做法如下&#xff1a; &#xff08;1&#xff09;读取图像为灰度图像&#xff0c;进行自适应直方图均衡化处理&#xff0c;增强图…