算法之美_源代码发布(10)
Posted 白马负金羁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法之美_源代码发布(10)相关的知识,希望对你有一定的参考价值。
1. List
列表,即list是Python中内置的一种结构化数据类型。它是一种有序的集合(注意其中元素的类型不要求相同),可以随时添加和删除其中的元素。
1 ) 初始化
list1 = [] #一个空列表
list2 = [1, 2, 3, 5] #一个非空列表
2 ) 基本操作
- 追加元素到末尾:
list1.append(6)
- 把元素插入到指定的位置,其中第一个参数是指示具体位置的索引:
list2.insert(3, 4)
- 用一个列表来扩展另外一个列表,即把一个列表中的所有元素追加到另外一个列表的末尾:
list2.extend(list1)
3)删除操作
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
list.pop([index=-1])
移除列表中某个值的第一个匹配项
list.remove(obj)
也可以使用 del 语句来删除列表的元素,注意中括号里是索引,例如:
del list1[2]
4 ) 列表解析(list comprehension)
从一个列表中筛选出符合条件的元素,例如:
list3 = [x for x in list2 if x%2==0]
5)a 与 a[:] 不同
直接运行:a is a[:] 返回值将是:False。
这是因为,a[:] 是创建 a 的一个副本,这样在代码中对 a[:] 进行操作,就不会改变 a 的值。而若直接对 a 进行操作,那么 a 的值会受到操作的影响,如 append() 等。
在函数调用时,如果需要改变列表参数,需要注意在函数中使用a[:]。例如下面的代码:
nums = [1,2,3,4,5,6,7]
def rotate(nums) -> None:
for i in range(3):
nums = [nums[-1]] + nums[:-1]
rotate(nums)
print(nums)
输入的结果仍然是[1, 2, 3, 4, 5, 6, 7]
下面的代码才会改变参数nums:
nums = [1,2,3,4,5,6,7]
def rotate(nums) -> None:
for i in range(3):
nums[:] = [nums[-1]]+nums[:-1]
rotate(nums)
print(nums)
输入的结果是[5, 6, 7, 1, 2, 3, 4]
2. Tuple
元组也是一种有序列表,它与列表很相似,但是元组中的内容是不能修改的。
tuple1 = (1, 2)
tuple1 = (1, ) #注意只有一个元素的tuple不能写成 tuple1 = (1)
或者有时你需要把把一个list转换成tuple,例如:
tuple2 = tuple(list2)
3. Dict
Python中内置了字典类型dict,即dictionary,在其他语言中也称为map,使用键-值(key-value)对存储,具有极快的查找速度。
1 ) 初始化与访问
dict1 = {} #一个空字典
dict2 = {'Tom': 95, 'Jack': 75, 'Mary': 85} #一个非空字典
通过键-值对的赋值,可以向字典中添加新元素(如果原键不存在的化),如果原键本就存在于字典中,那么赋值就相当于将原有值设置成新值(因为一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉),例如:
dict1['color'] = 'red'
dict2['Tom'] = 100
另外,如果要取某个key对应的value时,若key不存在,那么该访问将报KeyError错误。要避免这种错误,有两种方法:
i)访问前,先通过in判断key是否存在:
if 'Tom' in dict2:
print('Yes')
ii)通过dict提供的get()
方法,如果key不存在,可以返回None
,或者自己指定的value:
dict2.get('James')
dict2.get('James', -1)
2 ) 删除
删除字典中的某一项:
del dict2['Mary']
或者使用 pop(key[,default])
- 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
或者使用 popitem()
返回并删除字典中的最后一对键和值。如果字典已经为空,却调用了此方法,就报出 KeyError 异常。
3 ) 遍历
两个重要的方法:keys() 返回字典的所有的key,values() 返回字典所有的值,例如
for k in dict2.keys():
print(k)
4)defaultdict
当使用普通的字典时,用法一般是dict={},添加元素的只需要dict[element] =value即可,调用的时候也是如此,dict[element] = xxx,但前提是element存在于字典里,如果不在,字典里就会报错。这时defaultdict就能排上用场了,defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError,而是一个默认值。
defaultdict接受一个工厂函数作为参数,这个factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,例如:list对应[ ],str对应的是空字符串,set对应set( ),int对应0。
from collections import defaultdict
result = defaultdict(list)
data = [("p", 1), ("p", 2), ("p", 3), ("h", 1), ("h", 2), ("h", 3)]
for (key, value) in data:
result[key].append(value)
print(result)#defaultdict(<class 'list'>, {'p': [1, 2, 3], 'h': [1, 2, 3]})
5)OrderedDict
Python中,常规的字典是“无序的”。但collection模块中提供的OrderedDict子类则可以根据放入元素的先后顺序对元素进行排序(dict subclass that remembers the order entries were added),注意:OrderedDict中维护的顺序是元素放入字典的顺序,而非按key或value的大小顺序。
最新变化:From Python 3.6 onwards, the standard dict
type maintains insertion order by default.
但OrderedDict中的 popitem
(last=True) 与普通字典中的不同,它可以接受一个参数。
The popitem()
method for ordered dictionaries returns and removes a (key, value) pair. The pairs are returned in LIFO order if last is true or FIFO order if false.
4. Set
Set就是集合,它具有无序、不重复的特点。
1 ) 初始化
可以用一个列表来初始化一个集合,但是集合会对原列表做去重操作:
s1 = set([1, 1, 2, 2, 3, 3]) # {1, 2, 3}
s2 = set() # 初始化一个空集
2 ) 基本操作
通过add(key)
方法可以添加元素到set中,若添加了重复的元素,则不会产生效果;通过remove(key)
方法可以删除元素:
s1.add(4)
s1.remove(1)
此外,discard() 方法也可以用于移除指定的集合元素。该方法不同于 remove()
方法,因为 remove()
方法在移除一个不存在的元素时会发生错误,而 discard()
方法不会。
set.discard(value)
pop() 方法用于随机移除一个元素。例如:
fruits = {"apple", "banana", "cherry"}
x = fruits.pop()
print(x) #注意是随机的,例如可能输出banana
print(fruits) #如果上面移除的是banana,此处就会输出{'apple', 'cherry'}
对于set来说,数学上的定义的集合操作(包括求交、并等),Python中也是支持的:
s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
s1 & s2 #{2, 3}
s1 | s2 #{1, 2, 3, 4}
3 ) hashable 与 unhashable
为了追求高的搜索效率,Set中的元素必须是可哈希的(hashable)。基本数据类型都属于此类,Tuple也是如此。但列表是unhashable的。因此,“列表的列表”是可行的,但“列表的集合”则是不可行的。通常,如果集合中的元素是一个有序表,那么需要使用tuple类型。
listoflists = [[0, 1, 2], [2, 3, 5, 6], [0, 1, 2], [1, 2, 3, 4, 5]]
setoftuples = {tuple(l) for l in listoflists} #{(0, 1, 2), (1, 2, 3, 4, 5), (2, 3, 5, 6)}
【本文完】
以上是关于算法之美_源代码发布(10)的主要内容,如果未能解决你的问题,请参考以下文章