python基础数据类型四

来源:互联网 发布:产品跟踪软件 编辑:程序博客网 时间:2024/05/16 12:30

补充

list

在for循环中最好不要进行删除操作

在for循环中进行删除:经常出现的问题

1.索引超出范围
lis = [11,22,33,44,55]for i in range(len(lis)):    del lis[i]----------------Traceback (most recent call last):  File "D:/untitled/demo.py", line 4, in <module>    del lis[i]IndexError: list assignment index out of range

这就是 一个 因为循环删除操作 造成的 索引 超出范围的例子

2.不报错但是数据混乱
lis = [11,22,33,44,55]for i in lis:    lis.pop()----------------lis:[11,22]

因为当循环的时候 当前 i 超出当前循环的列表,直接退出循环

示例1:
需求:lis = [11,22,33,44,55] 删除列表 索引为奇数的元素
方法一
lis = [11,22,33,44,55]lis = lis[::2]
方法二
lis = [11,22,33,44,55]l1 = []for i in lis:    if lis.index(i) % 2 == 0:        l1.append(i)    lis = l1print(lis)
方法三
lis = [11,22,33,44,55]for i in range(len(lis)-1,-1,-1):    if i % 2 == 1:        del lis[i]
方法四
lis = [11,22,33,44,55]for i in lis[::-1]:    if lis.index(i) % 2 == 0:        lis.pop(lis.index(i))
总结

遇到需要迭代删除的问题,首先考虑是否可以不用删除而用添加后赋值的方式解决,如果不能解决,可以考虑逆向删除,不会影响到list的索引问题,或者就使用两个列表进行删除

dict

在for循环中不能进行删除操作
在for循环中进行删除:删除当前循环的字典就报错
dic = {'k1':'v1', 'k2':'v2', 'a3':'v3'}for i in dic:    if i.find('k') != -1:        dic.pop(i)-------------------Traceback (most recent call last):  File "D:/untitled/demo.py", line 25, in <module>    for i in dic:RuntimeError: dictionary changed size during iteration
解决方法
# dic = {'k1':'v1', 'k2':'v2', 'a3':'v3'}# dic2 = {'k1':'v1', 'k2':'v2', 'a3':'v3'}# for i in dic:#     if i.find('k') != -1:#         dic2.pop(i)## print(dic2)

集合

描述

在python中set的底层结构和字典是完全一样的都是哈希表,就当成是只有键没有值的字典就可以了。
Python 早期版本就没有set这个类型,那时候开发者都是直接建一个 {key1:None, key2:None}的字典来实现set的功能。
字典和set都是用空间来换时间,空间浪费很大。
set的最大用途是解决了判断某个元素在集合中出现的查找效率问题。 

集合中的元素有三个特征:

  • 确定性(集合中的元素必须是确定的) 
  • 互异性(集合中的元素互不相同。例如:集合A={1,a},则a不能等于1)
  • 无序性(集合中的元素没有先后之分),如集合{3,4,5}和{3,5,4}算作同一个集合。

常用用法

  • 去重
  • 测试两组数据之间的交集、差集、并集等关系。

方法

集合的创建

集合中的元素必须是不可变类型

set1 = set({1,2,'night'})set2 = {1,2,3}

增加

add
set1 = {'charmNight',1,2,3}set1.add('naem')print(set1)
update

将数据迭代添加到集合中

set1 = {'charmNight',1,2,3}set1.update([1,2,3])print(set1)------------{1, 2, 3, 11, 12, 13, 'charmNight'}
set1 = {'charmNight',1,2,3}set1.update({'name':111})print(set1)--------------{1, 2, 3, 'name', 'charmNight'}

删除

remove
set1 = {'charmNight',1,2,3}set1.remove(1)    # 根据元素删除
pop
set1 = {'charmNight',1,2,3}set1.pop()      # 随机删除一个 并返回删除的值
clear
set1 = {'charmNight',1,2,3}set1.clear()    # 清空集合
del
set1 = {'charmNight',1,2,3}del set1    # 删除集合

查询

只能使用迭代查询

set1 = {'charmNight',1,2,3}for i in set1:    print(set1)

集合的其他操作

交集。(&  或者 intersection)

set1 = {1,2,3,4,5}set2 = {4,5,6,7,8}print(set1 & set2)              # {4, 5}print(set1.intersection(set2))  # {4, 5}

并集。(| 或者 union)

set1 = {1,2,3,4,5}              set2 = {4,5,6,7,8}              print(set1 | set2)              # {1, 2, 3, 4, 5, 6, 7, 8}print(set1.union(set2))         # {1, 2, 3, 4, 5, 6, 7, 8}

差集。(- 或者 difference)

特有的元素

set1 = {1,2,3,4,5}              set2 = {4,5,6,7,8}print(set1 - set2)              # {1, 2, 3}print(set1,set2)                # {1, 2, 3, 4, 5} {4, 5, 6, 7, 8}print(set2.difference(set1))    # {8, 6, 7}

反交集。 (^ 或者 symmetric_difference)

set1 = {1,2,3,4,5}set2 = {4,5,6,7,8}print(set1 ^ set2)                      # {1, 2, 3, 6, 7, 8}print(set2.symmetric_difference(set1))  # {1, 2, 3, 6, 7, 8}

子集与超集

set1 = {1,2,3,4,5}set2 = {4,5,6,7,8}print(set1 < set2)          # Falseprint(set1.issubset(set2))  # 这两个相同,都是说明set1是set2子集。print(set2 > set1)          # Falseprint(set2.issuperset(set1))  # 这两个相同,都是说明set2是set1超集。
原创粉丝点击