Python中列表和字符串常用的数据去重方法你还记得几个?
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,
1 关于数据去重
- 关于数据去重,咱们这里简单理解下,就是删除掉重复的数据;
- 应用的场景比如某些产品产生的大数据,有很多重复的数据,为了不影响分析结果,我们可能需要对这些数据进行去重,删除重复的数据,提高分析效率等等。
2 字符串去重
2.1 for方法
- 基本思路是
for
循环先遍历字符串; - 遍历的字符要是没在结果字符串中,就添加到结果字符串即可。
- 代码如下:
import unittest
class TestDeduplication(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.char_date = "12344312abcdcbdaABCDDCBA张王李张"
print(f"原始字符串为:{cls.char_date}")
@classmethod
def tearDownClass(cls) -> None:
pass
def test_char_for(self):
char_date01 = ""
for data in self.char_date:
if data not in char_date01:
char_date01 += data
print(f"for方法去重后数据:{char_date01}")
if __name__ == "__main__":
unittest.main()
- 结果输出为:
原始字符串为:12344312abcdcbdaABCDDCBA张王李张
for方法去重后数据:1234abcdABCD张王李
2.2 while方法
- 思路和
for
差不多; - 这里主要是通过通过索引的方式查找;
- 代码如下:
import unittest
class TestDeduplication(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.char_date = "12344312abcdcbdaABCDDCBA张王李张"
print(f"原始字符串为:{cls.char_date}")
@classmethod
def tearDownClass(cls) -> None:
pass
def test_char_while(self):
char_date02 = ""
flag = len(self.char_date) - 1
while True:
if flag >= 0:
if self.char_date[flag] not in char_date02:
char_date02 += self.char_date[flag]
flag -= 1
else:
break
print(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):
@classmethod
def setUpClass(cls) -> None:
cls.list_data = ["A", "B", "C", "D", "E", "C", "A", "B"]
print(f"原始列表为:{cls.list_data}")
@classmethod
def tearDownClass(cls) -> None:
pass
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} ")
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/NoamaNelson
import unittest
class TestDeduplication(unittest.TestCase):
@classmethod
def 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}")
@classmethod
def tearDownClass(cls) -> None:
pass
def test_char_for(self):
char_date01 = ""
for data in self.char_date:
if data not in char_date01:
char_date01 += data
print(f"for方法去重后数据:{char_date01}")
def test_char_while(self):
char_date02 = ""
flag = len(self.char_date) - 1
while True:
if flag >= 0:
if self.char_date[flag] not in char_date02:
char_date02 += self.char_date[flag]
flag -= 1
else:
break
print(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']
- 放一张图吧(虽然用处不大,哈哈):
题外话
感谢你能看到最后,给大家准备了一些福利!
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python兼职渠道推荐*
学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
若有侵权,请联系删除
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)