python不可以直接進行字符減運算,當需要進行字符之間的減運算時,我們可以使用ord()函數,ord()函數是python自帶的函數,無需導入。
print(ord('b')-ord('a'))
#result:1
string = 'leetcode'
print(string[::-1])
#result:edocteel
import collections
li = [1,2,2,4,5,5]
cnt = collections.Counter(li)
print(cnt)
#result:Counter({
2: 2, 5: 2, 1: 1, 4: 1})
cnt = {
1:4,2:3}
#遍歷鍵值對
for item in cnt.items():
print(item)
#遍歷鍵
for item in cnt.keys():
print(item)
#遍歷值
for item in cnt.values():
print(item)
result:
(1, 4)
(2, 3)
1
2
4
3
li = [0]*length #第一種
li = [0 for i in range(length)] #第二種
li = [[0]*3 for i in range(4)] #二維數組
from collections import Counter
colors = ['red','blue','red','green','blue','blue']
c = Counter(colors)
print(c)
print(dict(c))
result:
Counter({
'blue': 3, 'red': 2, 'green': 1})
{
'red': 2, 'blue': 3, 'green': 1}
bisect是python的內置模塊,用於有序序列的插入和查找
查找:bisect(array,item)
插入:bisect(array,item)
import bisect
a = [1,2,2,5,8]
position = bisect.bisect(a,7)
print(position)
#4
bisect.insort(a,4) #找到位置插入
print(a)
#[1,2,2,4,5,8]
bisect.bisect_left(a,2) #插到左側
#1
bisect.bisect_right(a,2) #插到右側
#3
l1 = [1,4,4,2,3,4,5,6,1]
l2 = list(set(l1))
print(l2)
#result:[1, 2, 3, 4, 5, 6]
li = ['a','b','c']
print(' '.join(str(i) for i in li))
def square(x):
return x**2
a = list(map(square,[1,2,3,4,5])) #計算列表各元素的平方
b = list(map(lambda x:x**2,[1,2,3,4,5,])) #用lambda匿名函數
print(a,b)
#result:[1, 4, 9, 16, 25] [1, 4, 9, 16, 25]
deque是雙端隊列(double-ended queue)的縮寫,由於兩端都能編輯,deque既可以實現棧(stack),也可以實現隊列(queue)
from collections import deque
# que = collections.deque()
a=deque([1,2,3])
a.pop()
# [1,2]
a.append(4)
# [1,2,4]
a.popleft()
# [2,4]
a.appendleft(0)
# [0,2,4]
相比list實現的隊列,deque實現擁有更低的時間和空間復雜度。list實現出隊(pop)和插入(insert)時的空間
復雜度大約為O(n),deque在出隊(pop)和入隊(append)時的時間復雜度是O(1)。
from queue import PriorityQueue
Q = PriorityQueue()
Q.put(3)
Q.put(2)
Q.put(1)
Q.get()
優先級隊列,默認是從小到大排序的
li = [[1,3],[8,10],[2,6],[15,18]]
li.sort(key=lambda x:x[0])
li
print(li)
#result:[[1, 3], [2, 6], [8, 10], [15, 18]]
name = 'python'
f'Hello {name}'
print(f'Hello {name}')
systems = ['windows','ubuntu','mac']
version = ['20.20','19.10','21.20']
countries = ['UK','Chinese','US']
for system,ver,country in zip(systems,version,countries):
print(f'{
system} plays in {
ver}.country:{
country}')
person = {
'name':'YQ','age':22}
print('Name:',person.get('name'))
print('Age:',person.get('age'))
print('Salary:',person.get('salary'))
result:
Name: YQ
Age: 22
Salary: None
from collections import OrderedDict
mydict = OrderedDict({
'a':2,'b':1,'c':0})
for key,value in mydict.items():
print(key,value)
result:
a 2
b 1
c 0
nums = [1,2,2,2,3,4,4]
from collections import Counter
cnt = Counter(nums)
print(max(cnt.keys(),key = cnt.get))
#result:2
NameError: name 'lru_cache' is not defined
from functools import lru_cache
一個為函數提供緩存功能的裝飾器,直接用於一個用戶自定義函數,在下次以相同參數調用時直接返回上一次的結果
lru_cache maxsize 參數默認值為128.如果設為None,緩存可無限增長
from functools import lru_cache
@lru_cache(maxsize = None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
#字典排序
a = {
'a':3,'c':89,'b':0,'d':34}
#按照字典的值進行排序
a1 = sorted(a.items(),key = lambda x: x[1])
#按照字典的鍵進行排序
a2 = sorted(a.items(),key = lambda x: x[0])
print('按值排序後結果',a1)
print('按鍵排序後結果',a2)
print('結果轉為字典格式',dict(a1))
print('結果轉為字典格式',dict(a2))
result:
按值排序後結果 [('b', 0), ('a', 3), ('d', 34), ('c', 89)]
按鍵排序後結果 [('a', 3), ('b', 0), ('c', 89), ('d', 34)]
結果轉為字典格式 {
'b': 0, 'a': 3, 'd': 34, 'c': 89}
結果轉為字典格式 {
'a': 3, 'b': 0, 'c': 89, 'd': 34}
my_str = 'python'
my_str.isalpha()
print(my_str.isalpha())
多步排序,例如:先按內容進行排序,如果內容一樣再按照ID排序
my_test = ["b:7","a:7","c:4","d:3"]
def f(log):
id_,rest = log.split(":",1)
return (rest,id_)
print(sorted(my_test,key=f))
#result:['d:3', 'c:4', 'a:7', 'b:7']
比如上面的例子,先按照字符串值進行排序,再按照字符串的id排序
有時候需要用字典來統計一個列表中相同的元素的個數,但是可能元素也是一種列表,這種時候就不能直接使用
collections.Counter來統計,需要把原列表的元素轉為tuple
1、數組操作
1.1. 遍歷數組,枚舉索引和值
for i,j in enumerate([1,2,34,5,56,4]):
#i為索引
#j為值
1.2. 數組反轉
a = [1,2,3,4,5]
a[::-1]
a.reverse()
1.3. 數組排序
a = [1,2,6,8,0,3,4]
a.sort()
a = [[1,3],[2,4],[5,0]]
sort(key = lambda x:x[0]) #根據第一個數為key進行排序
1.4. 數組合並
a = [1,2,6,8,0,3,4]
b = [2,5,9]
a.extend(b)
a.[len(a):]=b
1.5. 構建棧和隊列
a = [1,2,6,8,0,3,4]
a.append() #數組尾部添加
a.insert(x,3) #在索引為x的位置插入3
a.pop() #刪除尾部元素
a.pop(0) #刪除索引為0的元素
a = [] #構建棧
a.append()
a.pop()
a = []
a.append()
a.pop(0)
1.6. 數組去重
#轉化為set,再轉化為list
a = [1,1,1,3,4,4]
a = list(set(a))
1.7. 查找數組
a.index(3)
2、字符串操作
2.1. 去除空格
a = ' hello world '
a.strip() #去除兩邊所有空格
a.lstrip() #去除左邊空格
a.rstrip() #去除右邊空格
2.2. 替換字符
#將a中的x替換為yyy,可以將空格' '替換為''等於去除空格
a.replace('x','yyy')
2.3. 合並字符
a = 'hello'
b = 'world'
c = a + b
2.4. 判斷字符組成
#如果string只包含數字則返回true,否則返回False
a.isdigit()
#如果string至少有一個字符並且所有字符都是字母或數字則返回True,否則返回False
a.isalnum()
#如果string至少有一個字符並且所有字符都是字母則返回True,否則返回False
a.isalpha()
2.5. 數組轉化為字符
#以string作為分隔符,將seq中所有的元素(的字符串表示)合並為一個新的字符串
#string.join(seq)
a = [1,2,3,4]
#''.join(a) #結果為'1234'
print(' '.join('%s' %id for id in a))
python 提供了一個直觀的在一行代碼中賦值與交換(變量值)的方法
x,y = 10,20
print(x,y)
x,y = y,x
print(x,y)
賦值的右側形成了一個新的元組,左側立即解析(unpack)那個(未被引用的)元組到變量和,一旦賦值完成,新的元組變成了未被引用狀態並且被標記為可被垃圾回收,最終完成了變量的交換
比較操作符的聚合是另一個有時很方便的技巧:
n = 10
result = 1<n<20
print(result) #True
result = 1>n<=9
print(result) #False
我們可以使用列表來初始化多個變量,在解析列表時,變量的數目不應該超過列表中元素個數:[元素個數與列表長度應該嚴格相同]
testList =[1,2,3]
x,y,z = testList
print(x,y,z) #1 2 3
如果你想知道引用到代碼中模塊的絕對路徑可以使用
import threading
import socket
print(threading)
print(socket)
這是一個我們大多數人不知道的有用特性,在python控制台,不論何時我們測試一個表達式或調用一個方法,結果都會分配一個臨時變量:_
#方法一:
#List = eval(input('輸入若干個數字,用逗號分隔:'))
#方法二:
#List = List(map(int,input('輸入數字,以空格分隔').split()))
#int可以換為float等,得到的數據也隨之為相應類型
#解釋:
#1. map()
#map()函數接受兩個參數,一個是函數,一個是序列,map將傳入的函數依次作用到序列的每個元素,並把結果作為新的list返回
#2. split()
#拆分字符串,通過指定分隔符對字符串進行切片,並返回分隔後的字符串列表
#3. map(function,input("以空格分開").split())
#由於input()輸出的是用空格分開的字符串,split()會分隔開各個值並放到列表中,此時在列表中的值是字符串,如果要運算,那麼必須在map()中利用int()或float()等處理再賦值
List = [1,2,3,4,5,6]
for i,j in enumerate(List): #i為下標,j為相應的數據
print("data:",end=' ')
print("index",i)
result:
data: index 0
data: index 1
data: index 2
data: index 3
data: index 4
data: index 5
a = 123
b = 'blue'
print(id(a)) #不同電腦,值應該不同
print(id(b))
a = ['A','B','C','D','E']
b = [1,2,3,4,5]
#方法一:
c1 = dict(zip(a,b))
#方法二
c2 = {
key:value for key,value in zip(a,b)}
#方法三
c3 = {
} #初始化一個空字典
for k,v in zip(a,b):
if k not in c3.keys(): #判斷k是否在c3字典的鍵中
c3[k] = v
print(c1)
print(c2)
print(c3)
result:
{
'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}
{
'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}
{
'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}
a = [1,2,3,1,2,4,6,5,6,6,7,9,10,10]
b = {
}
for i in a:
if i not in b.keys():
b[i] = 1
else:
b[i] =b[i] + 1
print(b)
#result:{
1: 2, 2: 2, 3: 1, 4: 1, 6: 3, 5: 1, 7: 1, 9: 1, 10: 2}
from sys import getsizeof
a = 100
b = 'green'
print(getsizeof(a)) #28
print(getsizeof(b)) #54
List1 = [1,2,3,4,56]
List2 = [1,1,3,4,5,5]
print("有重復元素:",len(List1) != len(set(List1))) #有重復元素:False
print("有重復元素:",len(List2) != len(set(List2))) #有重復元素:True
解釋:set(x)函數可以用於集合生成,其中的參數可以為任意數據類型,返回結果是一個無重復且排序任意的集合,
也就是說,如果輸入數據有重復,那麼返回的結果也會把重復的數據變得不重復
#方法一:
List1 = [1,2,3,4,56,11,2,3,4,5,6,7,1,2,3,1,1,1,19]
print(max(set(List1),key = List1.count)) #1
#方法二:
from collections import Counter #python的內置庫
ct = Counter(List1)
print(ct.most_common(1)) #輸出頻率最高的一個 #[(1,5)] 1出現5次
List1 = [1,2,5,4,7,6]
List2 = List1[::-1]
print(List2) #[6, 7, 4, 5, 2, 1]
list1=[1,2,5,4,7,6]
list2=['A','B','C','D']
list3=list1+list2#直接加
list4=list1.extend(list2)#調用列表的extend方法
print(list3) #[1, 2, 5, 4, 7, 6, 'A', 'B', 'C', 'D']
print(list4) #None
print(list1) #[1, 2, 5, 4, 7, 6, 'A', 'B', 'C', 'D']
解釋:為什麼list4為None?其實,這裡非常重要,列表的append和extend方法都會對原有列表進行修改,是不會返回一個新的列表的,返回值為None。
大多數的python程序員都知道且使用過列表推導list comprehensions,如果你對list comprehensions不熟,更簡短:
some_list = [1,2,3,4,5]
another_list = [x + 1 for x in some_list]
print(another_list) #[2, 3, 4, 5, 6]
some_list = [1,2,3,4,5,2,5,1,4,8]
even_set = {
x for x in some_list if x %2 == 0}
print(even_set) #{
8, 2, 4}
set([8,2,4])
d = {
x: x%2 == 0 for x in range(1,11)}
print(d) #{
1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False, 10: True}
在第一個例子裡,我們以some_list為基礎,創建了一個具有不重復元素的集合,而且集合裡只包含偶數,而在字典表中,我們創建了
一個key是不重復復的1到10之間的整數,value是布爾型,用來指示key是否是偶數
這裡另一個值得注意的是集合的字面量表示法,我們可以簡單的用這種方法創建一個集合
my_set = {
1,2,1,2,3,4}
print(my_set) #{
1, 2, 3, 4}
和collections庫一樣,還有一個庫較itertools,對某些問題真能高效的解決,其中一個用例是查找所有組合
from itertools import combinations
teams = ["Packers","49ers","Ravens","Patriots"]
for game in combinations(teams,2):
print(game)
result:
('Packers', '49ers')
('Packers', 'Ravens')
('Packers', 'Patriots')
('49ers', 'Ravens')
('49ers', 'Patriots')
('Ravens', 'Patriots')
我們可以在模塊的幫助下在python腳本中設置斷點
import pdb
pdb.set_trace()
#方法一:
#List = eval(input('輸入若干個數字,以逗號分隔:')) #輸入個數任意,都保存到list中
#方法二:
#List = list(map(int(input('輸入數字,以空格隔開').split())))
#int可以換成float等,得到的數據也隨之為相應類型
#解釋:
1.map()
map函數接收兩個參數,一個是函數,一個是序列,map將傳入的函數依次作用到序列的每個元素,並把結果作為新的list返回
2.split()
split拆分字符串,通過指定分隔符對字符串進行切片,並返回分割後的字符串列表
3.map(function,input("以空格分開").split())
由於input()輸出的是用空格分開的字符串,split()會分割開各個值並放到列表中,此時在列表中的值是字符串\
如果要用於運算,那麼必須在map()中利用int()或float()等處理,再賦值
分享:
經驗是我們創新的一個潛在條件。嚴格地說,有經驗而不受經驗制約時,經驗才是創新的一個條件,否則,經驗就會成為阻礙創新的障礙。經驗是有不同層次的。為了升華智慧,應盡可能借鑒高層次的經驗—
這不僅為我們提供了前進的方向,還提供了選擇的思路,使之成為觸發新成功的起點。