day1:python容器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day1:python容器相关的知识,希望对你有一定的参考价值。

python中的容器有:列表、元组、字典和集合

列表

技术分享
#使用[] 或list() 创建列表
num_list=list([1,2,3,4,5])
name_list=["Jack","Michael","Kangkang"]
print(num_list,name_list)

#使用list()将其他数据类型转换为列表

#将一个字符串转换成由单个字母组成的列表
li=list("cat dog")
print(li)

#将一个元组转换成列表
li=list(("first","second","third"))
print(li)

#使用split()可以依据分隔符将字符串分割成若干个子串组成的列表
birthday="8/5/1976"
li=birthday.split("/")
print(li)  #[‘8‘, ‘5‘, ‘1976‘]
#如果待分隔的字符串包含连续的分隔符,那么在返回的列表中会出现空串元素
splitme="a/b//c/d///e"
li=splitme.split("/")  #[‘a‘, ‘b‘, ‘‘, ‘c‘, ‘d‘, ‘‘, ‘‘, ‘e‘]
print(li)
li=splitme.split("//") #[‘a/b‘, ‘c/d‘, ‘/e‘]
print(li)

#使用string.join(str_list)可以把列表转化为字符串
name_list=["Groucho","Chico","Harpo"]
result="*".join(name_list)
print(result)   # Groucho*Chico*Harpo


#使用[offset]获取或者修改元素:指定的偏移量对于待访问列表必须有效
#print(marxes[-5],marxes[4])   IndexError: list index out of range
marxes=["Groucho","Chico","Harpo"]
print(marxes[0],marxes[1],marxes[2])
print(marxes[-1],marxes[-2],marxes[-3])
marxes[2]="Wanda"
print(marxes)

#指定范围并使用切片获取元素
marxes=["Groucho","Chico","Harpo"]
print(marxes[0:2]) #[‘Groucho‘, ‘Chico‘]
print(marxes[::2]) #[‘Groucho‘, ‘Harpo‘]
print(marxes[::-2]) #[‘Harpo‘, ‘Groucho‘]
print(marxes[::-1]) #[‘Harpo‘, ‘Chico‘, ‘Groucho‘]

#使用append()添加元素至尾部
marxes.append("Zeppo")
print(marxes)  #[‘Groucho‘, ‘Chico‘, ‘Harpo‘, ‘Zeppo‘]
#使用insert()在指定位置插入元素,如果偏移量超出了尾部则会插入到列表最后
marxes.insert(0,"Gummo")
print(marxes)  #[‘Gummo‘, ‘Groucho‘, ‘Chico‘, ‘Harpo‘, ‘Zeppo‘]
marxes.insert(10,"Karl")
print(marxes)  #[‘Gummo‘, ‘Groucho‘, ‘Chico‘, ‘Harpo‘, ‘Zeppo‘, ‘Karl‘]
#使用extend或者+=扩展列表
others=["cat","dog"]
marxes.extend(others) #[‘Gummo‘, ‘Groucho‘, ‘Chico‘, ‘Harpo‘, ‘Zeppo‘, ‘Karl‘, ‘cat‘, ‘dog‘]
print(marxes)
marxes+=[11,22,33] #[‘Gummo‘, ‘Groucho‘, ‘Chico‘, ‘Harpo‘, ‘Zeppo‘, ‘Karl‘, ‘cat‘, ‘dog‘, 11, 22, 33]
print(marxes)
#如果错误的使用了append,这个列表会被当做一个单独的元素添加
marxes=["Groucho","Chico","Harpo"]
marxes.append(others)
print(marxes)  #[‘Groucho‘, ‘Chico‘, ‘Harpo‘, [‘cat‘, ‘dog‘]]

#使用del删除指定位置的元素,超出索引报错
num_list=[11,22,33,44,55,66,77,88]
del num_list[-1] #[11, 22, 33, 44, 55, 66, 77]
print(num_list)
del num_list[1] #[11, 33, 44, 55, 66, 77]
print(num_list)
#使用pop获取并删除指定位置的元素,超出索引报错
num_list=[11,22,33,44,55,66,77,88]
result=num_list.pop()  #删除最后一个元素,并把这个元素返回给result
print(result,num_list) #88 [11, 22, 33, 44, 55, 66, 77]
result=num_list.pop(1) #删除第二个元素,并把这个元素返回给result
print(result,num_list) #22 [11, 33, 44, 55, 66, 77]
#使用remove删除具有指定值的元素
num_list=[11,22,33,44,55,66,77,88,"cat","dog"]
num_list.remove(88)
num_list.remove("cat")
print(num_list)

#使用index()查询具有特定值的元素位置
num_list=[11,22,33,44,55,66,77,88,"cat","dog","cat",True]
print(num_list.index(11))  # 0
print(num_list.index("cat")) # 8

#使用count()查询特定值出现的次数
print(num_list.count(88))
print(num_list.count("cat"))
#删除所有"cat"
for i in range(num_list.count("cat")):
    num_list.remove("cat")
print(num_list)

#使用len()返回列表长度
print(len([11,22,33,44])) # 4

#使用in 判断是否存在指定的值
print("cat" in num_list)
print(True in num_list)

#使用sort排序,使用reverse反转 (无返回值,直接更改列表本身)
num_list=[5,2,3,1,4]
num_list.sort()
print(num_list)  #[1,2,3,4,5]
num_list.reverse()
print(num_list)  #[5,4,3,2,1]

#包含列表的列表
small_birds=["hummingbird","finch"]
extinct_birds=["dodo","passenger pigeon","Norwegian Blue"]
carol_birds=[3,"French hens",2,"turtledoves"]
all_birds=[small_birds,extinct_birds,"macaw",carol_birds]
print(all_birds)#[[‘hummingbird‘, ‘finch‘], [‘dodo‘, ‘passenger pigeon‘, ‘Norwegian Blue‘], ‘macaw‘, [3, ‘French hens‘, 2, ‘turtledoves‘]]
print(all_birds[0])#[‘hummingbird‘, ‘finch‘]
print(all_birds[1])#[‘dodo‘, ‘passenger pigeon‘, ‘Norwegian Blue‘]
print(all_birds[1][0])#dodo
View Code
技术分享
[1, 2, 3, 4, 5] [Jack, Michael, Kangkang]
[c, a, t,  , d, o, g]
[first, second, third]
[8, 5, 1976]
[a, b, ‘‘, c, d, ‘‘, ‘‘, e]
[a/b, c/d, /e]
Groucho*Chico*Harpo
Groucho Chico Harpo
Harpo Chico Groucho
[Groucho, Chico, Wanda]
[Groucho, Chico]
[Groucho, Harpo]
[Harpo, Groucho]
[Harpo, Chico, Groucho]
[Groucho, Chico, Harpo, Zeppo]
[Gummo, Groucho, Chico, Harpo, Zeppo]
[Gummo, Groucho, Chico, Harpo, Zeppo, Karl]
[Gummo, Groucho, Chico, Harpo, Zeppo, Karl, cat, dog]
[Gummo, Groucho, Chico, Harpo, Zeppo, Karl, cat, dog, 11, 22, 33]
[Groucho, Chico, Harpo, [cat, dog]]
[11, 22, 33, 44, 55, 66, 77]
[11, 33, 44, 55, 66, 77]
88 [11, 22, 33, 44, 55, 66, 77]
22 [11, 33, 44, 55, 66, 77]
[11, 22, 33, 44, 55, 66, 77, dog]
0
8
1
2
[11, 22, 33, 44, 55, 66, 77, 88, dog, True]
4
False
True
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
[[hummingbird, finch], [dodo, passenger pigeon, Norwegian Blue], macaw, [3, French hens, 2, turtledoves]]
[hummingbird, finch]
[dodo, passenger pigeon, Norwegian Blue]
dodo
View Result

元组

技术分享
#元组一旦创建就无法修改,没有append,insert等方法
#使用()或者tuple()创建元组
tu=(11,22,33,44,"cat","Dog",True)
print(tu)
tu=tuple(range(10))
print(tu)
tu=tuple([1,2,3,4,1,2,1])
print(tu)
tu=1,2,3
print(tu)
print(dir(tu))     #查看所有成员
print(tu.count(1)) #查看指定元素的个数
print(tu.index(1)) #查看指定元素的第一次出现的索引

#元组解包:一口气将元组赋值给多个变量
marx_tuple=("Groucho","Chico","Harpo")
a,b,c=marx_tuple
print(a,b,c)
#可以利用元组在一条语句中对多个变量的值进行交换,而不需要借助临时变量
a="aaa"
b="bbb"
(a,b)=(b,a) 
print(a,b)
View Code
技术分享
(11, 22, 33, 44, cat, Dog, True)
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
(1, 2, 3, 4, 1, 2, 1)
(1, 2, 3)
[__add__, __class__, __contains__, __delattr__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __getnewargs__, __gt__, __hash__, __init__, __iter__, __le__, __len__, __lt__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __rmul__, __setattr__, __sizeof__, __str__, __subclasshook__, count, index]
1
0
Groucho Chico Harpo
bbb aaa
View Result

元组和列表相比,没有列表灵活,那为什么不在所有地方都使用列表呢?原因如下:

(1)元组占用的空间较小

(2)你不会意外修改元组的值

(3)可以将元组用作字典的键

(4)命名元组可以作为对象的替代

(5)函数的参数是以元组形式传递的

字典

技术分享
#使用{}创建字典
empty_dict={}
print(empty_dict)
dic={"k1":"v1","k2":"v2","k3":"v3"}
print(dic)
#使用dict()转换为字典
dic=dict(k1="v1",k2="v2",k3="v3")
print(dic)
lol=[["k1","v1"],["k2","v2"],["k3","v3"]]
print(dict(lol))
lot=[("k1","v1"),("k2","v2"),("k3","v3")]
print(dict(lot))
tol=(["k1","v1"],["k2","v2"],["k3","v3"])
print(dict(tol))
tot=(("k1","v1"),("k2","v2"),("k3","v3"))
print(dict(tot))
los=["ab","cd","ef"] #双字符组成的列表
print(dict(los))
tos=("ab","cd","ef") #双字符组成的元组
print(dict(tos))

#通过[key] 或者get(key,default) 获取元素
#通过dict[key]获取元素,key不存在时报错
#通过dict.get(key,default) 获取元素,key不存在时返回设置的默认值,没有设置默认值则返回None
print(dic["k1"],dic["k2"],dic["k3"])
print(dic.get("k1"),dic.get("k2","default"),dic.get("k3"),dic.get("k4"),dic.get("k5","default"))

#使用keys()获取所有键,values()获取所有值,items()获取所有键值对
for key in dic.keys():
    print(key)
for value in dic.values():
    print(value)
for key,value in dic.items():
    print(key,value)

#del删除具有指定键的元素,pop(key)删除并获取具有指定键的元素
del dic[k3]
print(dic)
result=dic.pop(k1)
print(result,dic)

#使用clear()删除所有元素
dic1={k1: v11, k2: v2, k3: v3}
dic1.clear()
print(dic1) #{}

#使用in判断某个键是否存在于一个字典
dic1={k1: v11, k2: v2, k3: v3}
print("k1" in dic1)  #True
print("k4" in dic1)  #False
print("v1" in dic1)  #False

#通过[key]添加或者修改元素
dic["k3"]="v22"  #dic中不存在k3键,在dic中添加{"k2":"v22"}
dic["k3"]="v3"   #dic中已经存在k3键,通过[key]修改
print(dic)       # dic={‘k3‘: ‘v3‘, ‘k2‘: ‘v2‘}

#通过update(add_dict)添加或修改字典
dic.update({"k1":"v11"}) #dic中不存在k1键,在dic中添加{"k1":"v11"}
print(dic)
dic.update({"k1":"v1"})  #dic中已经存在k3键,通过update修改
print(dic)  #{‘k3‘: ‘v3‘, ‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}
#如果添加字典与原字典包含相同的键,添加字典的值将会取代原来的值
dic.update({"k4":"v4","k5":"v5","k1":"v111111111"})
print(dic)#{‘k4‘: ‘v4‘, ‘k1‘: ‘v111111111‘, ‘k2‘: ‘v2‘, ‘k5‘: ‘v5‘, ‘k3‘: ‘v3‘}

a={"a":1,"b":2}
b={"a":2,"c":3}
#达到结果a={"a":1,"b":2,"c":"3"},即原字典有这个key,就不要加进来了
b.update(a)  #具有相同key,保留谁的值,作为update的参数,即可完成合并
print(b)   #{‘c‘: 3, ‘a‘: 1, ‘b‘: 2}

a={"a":1,"b":2}
b={"a":2,"c":3}
a.update(b)
print(a)  #{‘c‘: 3, ‘a‘: 2, ‘b‘: 2}
View Code
技术分享
{}
{k1: v1, k3: v3, k2: v2}
{k3: v3, k2: v2, k1: v1}
{k1: v1, k3: v3, k2: v2}
{k1: v1, k3: v3, k2: v2}
{k1: v1, k3: v3, k2: v2}
{k1: v1, k3: v3, k2: v2}
{a: b, e: f, c: d}
{a: b, e: f, c: d}
v1 v2 v3
v1 v2 v3 None default
k3
k2
k1
v3
v2
v1
k3 v3
k2 v2
k1 v1
{k2: v2, k1: v1}
v1 {k2: v2}
{}
True
False
False
{k3: v3, k2: v2}
{k3: v3, k2: v2, k1: v11}
{k3: v3, k2: v2, k1: v1}
{k5: v5, k3: v3, k4: v4, k2: v2, k1: v111111111}
{a: 1, c: 3, b: 2}
{a: 2, c: 3, b: 2}
View Result

集合

技术分享
#通过set()或者{}创建集合,空集合:set(),空字典:{}
s1=set()
print(type(s1))
print(dir(s1))
s2={1,2,3,3,4,5}
print(s2)
#使用set()将其他类型(字符串、列表、元组、字典(只有键会被使用))转化为集合
s3=set("letters")
print(s3)
s4=set([1,2,3,3,4,5])
print(s4)
s5=set((1,2,3,3,4,5))
print(s5)
s6=set({"k1":"v1","k2":"v2","k3":"v3"})
print(s6)
#使用in测试值是否存在
drink={martini:{vodka,vermouth},
       black russian:{vodka,kahlua},
       white russian:{vodka,cream,kahlua},
       manhattan:{rye,vermouth,bitters},
       screwdriver:{orange juice,vodka}
       }
print("选择含有伏特加(‘vodka‘)的饮料:")
for drink_name,contents in drink.items():
    if vodka in contents:
        print(drink_name)

print("选择有伏特加(‘vodka‘),并且没有乳糖(‘cream‘)和苦艾酒(‘vermouth‘)的饮料:")
for drink_name,contents in drink.items():
    if vodka in contents and cream not in contents and vermouth not in contents:
        print(drink_name)
#上面的判断也可以写成:
print("____________")
for drink_name,contents in drink.items():
    if vodka in contents and not (cream in contents or vermouth in contents):
        print(drink_name)

#add(element)添加
#元素不能有重复,如果有1,则True添加不进去,如果有0,则False添加不进去
s1={4,2,3,4,5,}
s1.add("element1")
s1.add(1)
s1.add(False)
print(s1)

#clear()清空
s1.clear()
print(s1)

#difference()或- 获得查集(出现在第一个集合而不出现在第二个(和第三个)集合),集合自身不变
#difference_update() 获得查集并返回给集合本身
a={1,2}
b={2,3}
c={1,4}
print(a-b-c)  #set()
print(a.difference(b,c)) #set()
a.difference_update(b,c)
print(a)  #a=set()

#symmetric_difference()或者^获得两个集合的异或集(仅在两个集合中出现一次)
#symmetric_difference_update() 获得异或集并返回给集合本身
#这两个函数只能传入一个参数
a={1,2}
b={2,3}
c={4}
print(a.symmetric_difference(b)) #{1,3}
print(a^b^c)                       #{1,3,4}
a.symmetric_difference_update(b) #a={1,3}
print(a)

#intersection() 或者&获得交集
#intersection_update() 获得交集并返回给集合本身
a={1,2}
b={2,3}
c={2,4}
print(a.intersection(b,c))    #{2}
print(a&b&c)                  #{2}
a.intersection_update(b,c)    #a={2}
print(a)

#union()或| 获得并集
#update()获得并集并返回给集合本身
a={1,2}
b={2,3}
c={4,5}
print(a.union(b,c)) #{1,2,3,4,5}
print(a|b|c)        #{1,2,3,4,5}
a.update(b,c)       #a={1,2,3,4,5}
print(a)

‘‘‘
小结:^(异或) -(差集) &(交集) |(并集)  都可以是多个集合。对应的除了symmetric_difference 和symmetric_difference_update 只能接收一个参数,其他的difference(),difference_update();intersection(),intersection_update();union(),update()都可以接收多个参数
‘‘‘

#使用issubset()或<=判断是否是子集,使用<判断是否是真子集
#使用issuperset()或>=判断是否是超集,使用>判断是否是真超集
a={1,2,3,4,5}
b={1,2,3}
print(b.issubset(a),b<=a,b<a) #True True True
print(a.issuperset(b),a>=b,a>b) #True True True
print(a<=a,a<a) #True False
View Code
技术分享
<class set>
[__and__, __class__, __contains__, __delattr__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __gt__, __hash__, __iand__, __init__, __ior__, __isub__, __iter__, __ixor__, __le__, __len__, __lt__, __ne__, __new__, __or__, __rand__, __reduce__, __reduce_ex__, __repr__, __ror__, __rsub__, __rxor__, __setattr__, __sizeof__, __str__, __sub__, __subclasshook__, __xor__, add, clear, copy, difference, difference_update, discard, intersection, intersection_update, isdisjoint, issubset, issuperset, pop, remove, symmetric_difference, symmetric_difference_update, union, update]
{1, 2, 3, 4, 5}
{e, t, r, s, l}
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
{k3, k2, k1}
选择含有伏特加(vodka)的饮料:
white russian
black russian
screwdriver
martini
选择有伏特加(vodka),并且没有乳糖(cream)和苦艾酒(vermouth)的饮料:
black russian
screwdriver
____________
black russian
screwdriver
{False, 1, 2, 3, 4, 5, element1}
set()
set()
set()
set()
{1, 3}
{1, 3, 4}
{1, 3}
{2}
{2}
{2}
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
True True True
True True True
True False
View Result

python计数器————未完待续

默认字典

技术分享
#使用setdefault()和defaultdict()处理缺失的值
#setdefault(key,value) 当键不存在时会在字典中添加一项,如果键存在,则不会改变原来的值
dic={first:1,second:2,third:3}
dic.setdefault(third,33)
dic.setdefault(fourth,4)
dic.setdefault(fifth,None)
dic.setdefault(fifth,5)
print(dic)

a=int()
b=list()
c=tuple()
print(a,b,c)  #a=0  b=[] c=()

#defaultdict在创建字典时,对每个新的键都会指定默认值,它的参数是一个函数
#当把函数int作为参数传入时,会按照int()调用,返回整数0
#当把函数list作为参数传入时,会按照list()调用,返回空列表[];
#传入tuple,返回空元组()
#传入dict,返回空字典{}
from collections import defaultdict
num_dict=defaultdict(int)
num_dict[first]=1
num_dict[second]=2
print(num_dict[third])
print(num_dict)

#函数defaultdict()的参数是一个函数,它的返回值赋给缺失键的值
def f():
    return ffff
f_dict=defaultdict(f)
f_dict[first]=11
f_dict[second]=22
f_dict[third]=33
print(f_dict[fourth],f_dict[fifth])
print(f_dict)

#list=[11,22,33,44,55,66,77,88,99]
#要求返回dic={‘k1‘:[11,22,33,44],‘k2‘:[55,66,77,88,99]}
#方法一:
num_list=list(range(11,100,11))
dic={}
for num in num_list:
    if num<55:
        if k1 in dic:
            dic[k1].append(num)
        else:
            dic[k1]=[num,]
    else:
        if k2 in dic:
            dic[k2].append(num)
        else:
            dic[k2]=[num,]
print(dic)
#方法二:
num_list=list(range(11,100,11))
dic=defaultdict(list)
for num in num_list:
    if num<55:
        dic[k1].append(num)
    else:
        dic[k2].append(num)
print(dic)
View Code
技术分享
{fifth: None, second: 2, fourth: 4, first: 1, third: 3}
0 [] ()
0
defaultdict(<class int>, {second: 2, first: 1, third: 0})
ffff ffff
defaultdict(<function f at 0x0000000002C9CBF8>, {fifth: ffff, second: 22, fourth: ffff, first: 11, third: 33})
{k2: [55, 66, 77, 88, 99], k1: [11, 22, 33, 44]}
defaultdict(<class list>, {k2: [55, 66, 77, 88, 99], k1: [11, 22, 33, 44]})
View Result

深浅拷贝原理————未完待续

以上是关于day1:python容器的主要内容,如果未能解决你的问题,请参考以下文章

小白的Python之路 day1 变量

python基础day1

python学习笔记-day1

坚持Selenium+Python学习之从读懂代码开始 DAY1

Python学习-day1

Python之路,day1