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 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
类组织测试用例; 代码如下:
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' ]
放一张图吧(虽然用处不大,哈哈):