首页 > 编程语言 >Python中列表和字符串常用的数据去重方法你还记得几个?

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

时间:2023-11-23 10:32:55浏览次数:31  
标签:Python self list 列表 char date 字符串 data def

(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,self,list,列表,char,date,字符串,data,def
From: https://blog.51cto.com/NoamaNelson/8525358

相关文章

  • Python GUI编程
    #!/usr/bin/python--coding:UTF-8--Python2.x导入方法fromTkinterimport*#导入Tkinter库Python3.x导入方法#fromtkinterimport*root=Tk()#创建窗口对象的背景色#创建两个列表li=['C','python','php','htm......
  • C#.NET 循环字符串 V20231123
    C#.NET循环字符串V20231123 publicstaticboolIsIllegalOutTradeNo(stringOutTradeNo){foreach(chariteminOutTradeNo){if(item=='('||item==')'||item==','||item=......
  • VS2022新建python项目爬虫网页
    一、安装python插件。 二、新建python项目。 三、安装配置DEBUG环境。   四、根据操作系统选择DEBUG环境。 五、安装requests库 在当前DEBUG环境安装requests库 六、使用requests库,爬取网页内容 完结! ......
  • 字符串之多种个性化格式处理
    此文重点讲述:字符串之个性化格式处理。个性化字符串工具类importjava.util.List;importjava.util.Random;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/***字符串工具类*/publicfinalclassStringUtils{privateStringUtils(){......
  • CART算法解密:从原理到Python实现
    本文深入探讨了CART(分类与回归树)算法的核心原理、实现方法以及应用场景。文章首先介绍了决策树的基础知识,然后详细解析了CART算法的工作机制,包括特征选择和树的构建。接着,通过Python和PyTorch的实例代码展示了CART算法在实际问题中的应用。最后,文章评价了该算法的优缺点,并讨论了......
  • Java开发者的Python快速进修指南:迭代器(Iterator)与生成器
    这一篇内容可能相对较少,但是迭代器在Java中是有用处的。因此,我想介绍一下Python中迭代器的使用方法。除了写法简单之外,Python的迭代器还有一个最大的不同之处,就是无法直接判断是否还有下一个元素。我们只能通过捕获异常或使用for循环来退出迭代,这点让我感到十分惊讶。可迭代对象......
  • (字符串)01-字符串变形
    1importjava.util.*;23publicclassSolution{4/**5*@paramsstring字符串6*@paramnint整型7*@returnstring字符串8*/9publicStringtrans(Strings,intn){10//校验字符串长度11if......
  • 聪明办法学python task03,04
    常用内置类型int/float/bool/type运算符:@矩阵乘法/表示浮点除法//表示整除**表示次方类型影响语义Ins和str不能作加减法运算符优先级次方高于乘法浮点数有误差!与或非与:都真才真或:有真则真非:相反typevsisinstancetype(x)==isinstance(x,_)新值会覆盖旧值新值不必非要与旧值类型......
  • python004超市购物系统-计算机毕业设计源码+LW文档
    摘 要随着国内市场经济这几十年来的蓬勃发展,突然遇到了从国外传入国内的互联网技术,互联网产业从开始的群众不信任,到现在的离不开,中间经历了很多挫折。从当初的传统销售行业抵制互联网销售,到现在传统销售与网络销售的结合模式,都代表着网络购物是一种潮流,是线下实体经济的补充,不再......
  • python005基于BS架构的在线学习与推荐系统-计算机毕业设计源码+LW文档
    摘 要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本在线学习与推荐系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率......