Day7 集合、深浅copy、数据类型转换及一些坑

集合

Set={'wusir','alex',1,2,3}

集合要求里面的元素必须是不可变的数据类型,但是集合本身是可变的数据类型。

集合里面的元素不重复(天然去重),无序。

主要用途:1,去重。

             2,关系测试。

去重

l1 = [1,1,2,3,4,4,3,2,1,5,5]
set1 = set(l1)
l2 = list(set1)

 

增和删

set1.add('abc')#直接加

set1.update('abc')#迭代着加,相当于extend

set1.remove('abc')#直接删
set1.pop()#随机删
set1.clear()#清空集合
del set1#在内存上删除整个集合

  

关系测试

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

并集
print(set1 | set2)
print(set1.union(set2))

反交集
print(set1 ^ set2)
print(set1.symmetric_difference(set2))

差集
print(set1 - set2)
print(set1.difference(set2))

子集
set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
print(set1 < set2)  # True
print(set1.issubset(set2))

超集
print(set2 > set1)
print(set2.issuperset(set1))

冻结集合
set1 = {1,2,3}
set3 = frozenset(set1)
print(set3)  # 不可变的数据类型。

  

深浅copy

浅copy:l1中的列表加了一个666,l2也会跟着一起加
l1 = [1,2,3,[4,5,6,7],8,9]
l2 = l1.copy()
l1[3].append(666)
print(l2)

深copy
import copy
l1 = [1,2,3,[22,]]
l2 = copy.deepcopy(l1)
print(l1,l2)
l1.append(666)
l1[-1].append('太白')
print(l2)

  

应用场景:面试会考,解释深浅copy

      完全独立的copy一份数据,与原数据没有关系,深copy

      如果一份数据(列表)第二层时,你想与原数据进行公用,浅copy。

各数据类型的转换

字典

dict = {'name': 'Zara', 'age': "7", 'class': 'First'}

字典转为字符串

1.print(str(dict),type(str(dict)))

返回{'name': 'Zara', 'age': "7", 'class': 'First'}

2.print("".join(dict))

将字典中所有的key转成字符串(前提是所有的key都是str)

3.print(tuple(dict.values()))

将字典中所有的value转成字符串(前提是所有的value都是str)

字典转元组

1.print(tuple(dict))

将字典中所有的key转成元组

2.print(tuple(dict.values()))

将字典中所有的value转成元组

字典转列表

1.print(list(dict)

将字典中所有的key转成列表

2.print(tuple(dict.values()))

将字典中所有的key转成列表

元组

tup=(1, 2, 3, 4, 5)

qwe = ("hi","hello","world")

元组转字符串

1.print(str(tup),type(str(tup)))

print(str(qwe),type(str(qwe)))

2.print("".join(qwe)) (前提是qwe中的数据类型都是str)

元组转列表

print(list(tup))

元组不能转字典

列表

nums=[1, 3, 5, 7, 8, 13, 20];

l1 = ["hi","hello","world"]

列表转字符串

1.print(str(nums))

2.print(" ".join(l1)) (前提是l1中的数据类型都是str)

列表转元组

1.print(tuple(nums))

2.print(tuple(l1))

列表不能转字典

字符串

s1="1,2,3"

s2="hi hello world"

字符串转列表

1.print(list(eval(s1)))适用于s1这种字符串里是int类型的

2.print(s1.split())

字符串转元组

1.print(tuple(eval(s1)))不适用s1里面有str

2.print(tuple(s2.split()))适用于s2里都是str

字符串转字典

sd = "{'name':'ljq', 'age':24}"

print(eval(sd))

一些坑

元组

如果元组中只有一个数据,且没有逗号,则该 '元组' 与里面的数据的数据类型相同。

tu1 = (1,)
tu2 = ('abc')
tu3 = ([1,2,3],)
print(tu1,type(tu1))
print(tu2,type(tu2))
print(tu3,type(tu3))

 

列表 

在循环一个列表时,如果对列表中的某些元素进行删除,

那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。

l1 = [11, 22, 33, 44, 55, 66, 77, 88]
#这样在循环里面删除结果与预期不一样
for i in range(len(l1)):
    if i % 2 == 1:
        l1.pop(i)
print(l1)


解决:可以倒着删除
for index in range(len(l1)-1, -1, -1):
    if index % 2 == 1:
        l1.pop(index)
print(l1)

在循环一个列表时,最好不要对此列表进行改变大小(增删)的操作。

字典 

字典创建的第三中方法

创建字典的第三中方法,但是这种字典里面的value是指向同一地址,改一个另外的也一起改了。
fromkeys()
dic1 = dict.fromkeys([1,2,3],'abc')
print(dic1)

在循环一个字典时,不能改变字典的大小。

  

dic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'}
将 dic的键中含有k元素的所有键值对删除。
for key in dic:
    if 'k' in key:
        dic.pop(key)
dictionary changed size during iteration: 在循环一个字典时,不能改变字典的大小。


解决:加一个列表
l1 = []
for key in dic:
    if 'k' in key:
        l1.append(key)
# print(l1)
for key in l1:
    dic.pop(key)
print(dic)

  

猜你喜欢

转载自www.cnblogs.com/hanayo/p/9457106.html
今日推荐