python中的list, dict, tuple以及collections模块的基本用法

1.关于list的一些基本用法

# 创建没有初值的列表
list1=[]

# 创建有初值的列表
list2=['this','is','a','list']

# 创建给定长度但初值不确定的列表
list3=[0 for x in range(4)]

# len()函数用于获取列表的长度
print(len(list1))
print(len(list2))

# 索引用来访问列表
print(list2[0])
print(list2[-1])  # -1用于查询最后一个元素

# 往列表末尾追加元素
list1.append('element')

# 往列表指定位置添加元素
list2.insert(1,'insert at 1')

# 删除列表末尾元素,用pop()方法
list2.pop()

# 删除列表指定位置的元素,用pop(i)方法
list2.pop(1)

# 列表中的元素的数据类型可以不同
list3[0]='string'
list3[1]=2
list3[2]=True
list3[3]=['this','is','a','sublist']
print(list3)

# 合并两个list
list1=[1,2,3]
list2=[4,5,6]


print(list1+list2) # 输出:[1, 2, 3, 4, 5, 6] print(list2+list1) # 输出:[4, 5, 6, 1, 2, 3]

list1.extend(list2) print(list1) # 输出:[1, 2, 3, 4, 5, 6]
# 翻转列表
list1.reverse()

 

2.关于tuple的一些知识

# tuple是另一种有序列表,叫元组。与list不同的是,tuple一旦初始化就不能修改
# 也就是说tuple没有append(),insert()这些方法,也不能根据索引赋值。
# tuple增加了代码的安全性。

# 空tuple
tuple1=()

# 只有一个元素的tuple要写成如下样子
tuple2=(1,)

# tuple中的元素的数据类型也不需要是相同的
tuple3=('a',1,['this','is','a','list'])
# 因为tuple3中第二个元素是一个列表,因此可以更改该列表的值
tuple3[2][0]='that'
print(tuple3)  # 输出:('a', 1, ['that', 'is', 'a', 'list'])

 

3.关于dict的一些知识

# 创建空字典
dict1=dict()

# 创建非空字典
dict2={'a':1,'b':2}

# 插入数据
dict1['a']=3

# 查找数据
dict1['a']
# 但是这种方法当key不存在时会报错。为解决该问题,可以先判断key是否存在:
if 'a' in dict1:
    print(dict1['a'])
# 或者用get()方法
dict1.get('b')
dict1.get('b',-1) # 指定当key不存在时返回的结果

# 用pop()方法删除key-value对
dict2.pop('a')

# 需要注意的是key必须是不可变对象,即list不能作为key,可以先把list转成tuple。

 

4.关于set的一些知识:

# set与dict类似,也是一组key的集合,但是不存储value。由于key不能重复,set中没有重复的key。
# 创建set,需要提供一个list作为输入集合,重复的元素将自动被过滤掉
set1=set([1,2,3,1,2,4])  # 输出:{1, 2, 3, 4}

# 使用add(key)向set中添加元素。
set1.add(5)

# remove(key)用于删除元素
set1.remove(1)

# 两个set的交集和并集
set2=set([2,3,4,5,6])
set3=set1&set2  # 输出:{2, 3, 4, 5}
set4=set1|set2  # 输出:{2, 3, 4, 5, 6}

 

5.Python Collections模块

该模块实现特定目标的容器,提供python标准内建容器dict, list, set, tuple的替代选择。

Counter

# Counter是字典的一个子类,提供了可哈希对象的计数功能
import collections

# 统计字符出现的次数,输出:Counter({'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
a=collections.Counter('hello world') 
# 统计单词数,输出:Counter({'hello': 3, 'world': 2, 'china': 1})
c=collections.Counter('hello world hello world hello china'.split())

# 获取指定对象的访问次数,以下两种均可
c['hello']
c.get('hello')

# 查看元素,输出:['hello', 'hello', 'hello', 'world', 'world', 'china']
list(c.elements())

# 查看n个访问频率最高的元素和计数,输出:[('hello', 3), ('world', 2)]
c.most_common(2)

# 追加对象
d=collections.Counter('hellow world'.split())
c+d  # 或者用c.update(d)
c-d  # 或者用c.subtract(d)

# 清除
c.clear()

 

defaultdict

# defaultdict(default_factory)给不存在的key一个默认的初始值
import collections

# 不存在的key的默认初始值都是空列表
dict1=collections.defaultdict(list)
print(dict1['a'])  # 输出:[]

# 不存在的key默认初始值都是0
dict2=collections.defaultdict(int)
print(dict2['a'])  # 输出:0

# 不存在的key默认值初始值都是空字符串
dict3=collections.defaultdict(str)
print(dict3['a'])  # 输出空字符串

# 使用匿名函数指定默认值,因为defaultdict接受的参数default_factory就是一个函数对象
dict4=collections.defaultdict(lambda:'no key')
print(dict4['a'])  # 输出:no key

# 或者定义一个函数,用来指定默认值
def get_default():
    return 'default value'

dict5=collections.defaultdict(get_default)
print(dict5['a'])  # 输出:default value

 

OrderedDict:key保留顺序的字典,但是python3.7后普通的字典也能保留顺序。根据官方文档,OrderedDict与普通dict的区别在于:

1.普通dict被设计为非常擅长映射操作,跟踪插入顺序是次要的。

2.OrderedDict擅长重新排序操作。

等等等等,因为这个我不常用,所以没有仔细看。

 

namedtuple

# namedtuple 命名元组,赋予每个位置一个含义,提供可读性和自文档性。
import collections

Point=collections.namedtuple('Point',['positionx','positiony'])

p=Point(11,positiony=22)
q=Point(positiony=11,positionx=22)

Point1=collections.namedtuple('Point1','posx,posy')
p1=Point1(11,22)

Point2=collections.namedtuple('Point2','posx posy')
p2=Point2(11,12)

p2.posx
p.positionx

感觉像定义了类。

 

deque 双向队列,这个刷leetcode时,经常会用到

import collections

d1=collections.deque()
# 从右边添加元素
d1.append(1)

# 从左边添加元素
d1.appendleft(2)

print(d1)   # 输出为:deque([2,1])

# 在指定位置插入元素
d1.insert(1,3)  

print(d1) # 输出为:deque([2,3,1])

# 从右边扩展列表
d1.extend([4,5,6])

# 从左边扩展列表
d1.extendleft([7,8,9])

print(d1)  # 输出为:deque([9,8,7,2,3,1,4,5,6])

# 查找元素的索引
print(d1.index(3))  # 输出为4
print(d1.index(3,0,5)) # 查找指定区间

# 获取并删除最右边的元素,有点类似于栈,先进后出
x=d1.pop()
print(x)  # 输出为6
print(d1) # 输出为deque([9,8,7,2,3,1,4,5])

# 获取并删除最左边的元素,类似于传统队列,先进先出
y=d1.popleft()
print(y)  # 输出为9
print(d1)  # 输出为deque([8,7,2,3,1,4,5])

# 删除指定元素
d1.remove(3)  
print(d1)  # 输出为deque([8,7,2,1,4,5])

# 队列翻转
d1.reverse()
print(d1)  # 输出为deque([5,4,1,2,7,8])

# 把右边元素放到左边
d1.rotate(2)
print(d1)  # 输出为deque([7,8,5,4,1,2])

# 浅拷贝
d2=d1.copy()

# 清空队列
d1.clear()

 

Refs:

[1]使用list和tuple - 廖雪峰的官方网站 (liaoxuefeng.com)

[2]Python-collections模块之defaultdict - MrSu - 博客园 (cnblogs.com)

[3]Python中collections模块 - Python运维开发 - 博客园 (cnblogs.com)

[4]python3 deque(双向队列) - Water~ - 博客园 (cnblogs.com)

上一篇:CAD工具——图纸剪切


下一篇:Collections集合工具类