Python中列表和字符串常用的數據去重方法總結
1 關于數據去重
- 關于數據去重,咱們這里簡單理解下,就是刪除掉重復的數據;
- 應用的場景比如某些產品產生的大數據,有很多重復的數據,為了不影響分析結果,我們可能需要對這些數據進行去重,刪除重復的數據,提高分析效率等等。
2 字符串去重
2.1 for方法
- 基本思路是
for
循環(huán)先遍歷字符串; - 遍歷的字符要是沒在結果字符串中,就添加到結果字符串即可。
- 代碼如下:
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
來創(chuàng)建一個新的字典; - 部分代碼如下:
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方法
- 循環(huán)遍歷列表后添加到新的列表即可;
- 這個方法不會改變原來的順序;
- 代碼如下:
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方法
- 先對原序列進行排序;
- 循環(huán)遍歷列表后使用
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 # 作用:字符串和列表去重 # 聯(lián)系: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中列表和字符串常用的數據去重方法總結的詳細內容,更多關于Python列表和字符串數據去重的資料請關注腳本之家其它相關文章!
相關文章
Python實現封裝打包自己寫的代碼,被python import
這篇文章主要介紹了Python實現封裝打包自己寫的代碼,被python import,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07