补充
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 = l1
print(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) # False
print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。
print(set2 > set1) # False
print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。