python基础数据类型四

补充

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超集。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值