1. 能不能詳細解釋下python列表
一、概念
在Python中,列表(list)是常用的數據類型。列表由一系列按照特定順序排列的項(item)組成。列表用方括弧「[]」括起來,並用逗號「,」來分隔其中的項。
例如,下面的列表包含了幾種用字元串表示的水果:
列表中的項和項之間的數據類型也可以不同。例如,下面的列表包含了數字和字元串:
關於Python的基礎問題可以看下這個網頁的視頻教程,網頁鏈接,希望我的回答能幫到你。
2. python 數組和列表的區別
python沒有數組,只有元組(tuple)和列表(list)。
元組與列表最大的不同在於,元組一旦創建便不可改變,
因此不像列表,元組不能夠在末尾追加(append)元素,彈出(pop)元素,
只能對元組中的元素進行索引t[0],不能對其中的元組進行賦值t[0]=8。
使用元組的好處在於對元組進行操作更為高效,適合存放一組常量。
3. python中列表和元組之間有什麼區別
除了元組是不可變的之外,還應有語義上的區別來指導它們的用法。元組是異構數據結構(即它們的條目具有不同的含義),而列表是同類序列。元組具有結構,列表具有順序。
使用這種區別可以使代碼更加明確和易於理解。
一個示例是成對的頁和行號,以成對參考書中的位置,如:
my_location = (42, 11) # page number, line number
然後,可以將其用作字典中的鍵來存儲有關位置的注釋。另一方面,列表可用於存儲多個位置。自然地,人們可能想在列表中添加或刪除位置,因此使列表可變是有意義的。另一方面,從現有位置添加或刪除項目沒有意義-因此,元組是不可變的。
在某些情況下,可能想更改現有位置元組中的項目,例如在頁面的各行中進行迭代時。但是元組不變性迫使您為每個新值創建一個新的位置元組。從表面上看,這似乎很不方便,但是使用這樣的不可變數據是值類型和函數式編程技術的基石,它可以具有很多優點。
官方Python文檔也提到了這一點
「組是不可變的,並且通常包含一個異類序列…」。
在像Haskell這樣的靜態類型語言中,元組中的值通常具有不同的類型,並且元組的長度必須固定。在列表中,所有值都具有相同的類型,並且長度不是固定的。因此區別非常明顯。
4. Python判斷列表是否已排序的各種方法及其性能
本節判斷列表排序的函數名格式為IsListSorted_XXX()。為簡潔起見,除代碼片段及其輸出外,一律以_XXX()指代。
2.1 guess
def IsListSorted_guess(lst):
listLen = len(lst) if listLen <= 1: return True
#由首個元素和末尾元素猜測可能的排序規則
if lst[0] == lst[-1]: #列表元素相同
for elem in lst: if elem != lst[0]: return False
elif lst[0] < lst[-1]: #列表元素升序
for i, elem in enumerate(lst[1:]): if elem < lst[i]: return False
else: #列表元素降序
for i, elem in enumerate(lst[1:]): if elem > lst[i]: return False
return True
_guess()是最通用的實現,幾乎與語言無關。值得注意的是,該函數內會猜測給定列表可能的排序規則,因此無需外部調用者指明排序規則。
2.2 sorted
def IsListSorted_sorted(lst):
return sorted(lst) == lst or sorted(lst, reverse=True) == lst
_sorted()使用Python內置函數sorted()。由於sorted()會對未排序的列表排序,_sorted()函數主要適用於已排序列表。
若想判斷列表未排序後再對其排序,不如直接調用列表的sort()方法,因為該方法內部會判斷列表是否排序。對於已排序列表,該方法的時間復雜度為線性階O(n)——判斷為O(n)而排序為O(nlgn)。
2.3 for-loop
def IsListSorted_forloop(lst, key=lambda x, y: x <= y):
for i, elem in enumerate(lst[1:]): #注意,enumerate默認迭代下標從0開始
if not key(lst[i], elem): #if elem > lst[i]更快,但通用性差
return False
return True
無論列表是否已排序,本函數的時間復雜度均為線性階O(n)。注意,參數key表明預設的排序規則為升序。
2.4 all
def IsListSorted_allenumk(lst, key=lambda x, y: x <= y):
return all(key(lst[i], elem) for i, elem in enumerate(lst[1:]))import operatordef IsListSorted_allenumo(lst, oCmp=operator.le):
return all(oCmp(lst[i], elem) for i, elem in enumerate(lst[1:]))def IsListSorted_allenumd(lst):
return all((lst[i] <= elem) for i, elem in enumerate(lst[1:]))def IsListSorted_allxran(lst, key=lambda x,y: x <= y):
return all(key(lst[i],lst[i+1]) for i in xrange(len(lst)-1))def IsListSorted_allzip(lst, key=lambda x,y: x <= y):
from itertools import izip #Python 3中zip返回生成器(generator),而izip被廢棄
return all(key(a, b) for (a, b) in izip(lst[:-1],lst[1:]))
lambda表達式與operator運算符速度相當,前者簡單靈活,後者略為高效(實測並不一定)。但兩者速度均不如列表元素直接比較(可能存在調用開銷)。亦即,_allenumd()快於_allenumo()快於_allenumk()。
若使用lambda表達式指示排序規則,更改規則時只需要改變x和y之間的比較運算符;若使用operator模塊指示排序規則,更改規則時需要改變對象比較方法。具體地,lt(x, y)等效於x < y,le(x, y)等效於x <= y,eq(x, y)等效於x == y,ne(x, y)等效於x != y,gt(x, y)等效於x > y,ge(x, y)等效於x >= y。例如,_allenumo()函數若要嚴格升序可設置oCmp=operator.lt。
此外,由all()函數的幫助信息可知,_allenumk()其實是_forloop()的等效形式。
2.5 numpy
def IsListSorted_numpy(arr, key=lambda dif: dif >= 0):
import numpy try: if arr.dtype.kind == 'u': #無符號整數數組執行np.diff時存在underflow風險
arr = numpy.int64(lst) except AttributeError: pass #無dtype屬性,非數組
return (key(numpy.diff(arr))).all() #numpy.diff(x)返回相鄰數組元素的差值構成的數組
NumPy是用於科學計算的Python基礎包,可存儲和處理大型矩陣。它包含一個強大的N維數組對象,比Python自身的嵌套列表結構(nested list structure)高效得多。第三節的實測數據表明,_numpy()處理大型列表時性能非常出色。
在Windows系統中可通過pip install numpy命令安裝NumPy包,不建議登錄官網下載文件自行安裝。
2.6 rece
def IsListSorted_rece(iterable, key=lambda x, y: x <= y):
cmpFunc = lambda x, y: y if key(x, y) else float('inf') return rece(cmpFunc, iterable, .0) < float('inf')
rece實現是all實現的變體。累加器(accumulator)中僅存儲最後一個檢查的列表元素,或者Infinity(若任一元素小於前個元素值)。
前面2.1~2.5小節涉及下標操作的函數適用於列表等可迭代對象(Iterable)。對於通用迭代器(Iterator)對象,即可以作用於next()函數或方法的對象,可使用_rece()及後面除_rand()外各小節的函數。迭代器的計算是惰性的,只有在需要返回下一個數據時才會計算,以避免不必要的計算。而且,迭代器方式無需像列表那樣切片為兩個迭代對象。
2.7 imap
def IsListSorted_itermap(iterable, key=lambda x, y: x <= y):
from itertools import imap, tee
a, b = tee(iterable) #為單個iterable創建兩個獨立的iterator
next(b, None) return all(imap(key, a, b))
2.8 izip
def IsListSorted_iterzip(iterable, key=lambda x, y: x <= y):
from itertools import tee, izip
a, b = tee(iterable) next(b, None) return all(key(x, y) for x, y in izip(a, b))def pairwise(iterable):
from itertools import tee, izip
a, b = tee(iterable) next(b, None) return izip(a, b) #"s -> (s0,s1), (s1,s2), (s2, s3), ..."def IsListSorted_iterzipf(iterable, key=lambda x, y: x <= y):
return all(key(a, b) for a, b in pairwise(iterable))
第三節的實測數據表明,雖然存在外部函數調用,_iterzipf()卻比_iterzip()略為高效。
2.9 fast
def IsListSorted_fastd(lst):
it = iter(lst) try:
prev = it.next() except StopIteration: return True
for cur in it: if prev > cur: return False
prev = cur return Truedef IsListSorted_fastk(lst, key=lambda x, y: x <= y):
it = iter(lst) try:
prev = it.next() except StopIteration: return True
for cur in it: if not key(prev, cur): return False
prev = cur return True
_fastd()和_fastk()是Stack Overflow網站回答里據稱執行最快的。實測數據表明,在列表未排序時,它們的性能表現確實優異。
2.10 random
import randomdef IsListSorted_rand(lst, randNum=3, randLen=100):
listLen = len(lst) if listLen <= 1: return True
#由首個元素和末尾元素猜測可能的排序規則
if lst[0] < lst[-1]: #列表元素升序
key = lambda dif: dif >= 0
else: #列表元素降序或相等
key = lambda dif: dif <= 0
threshold, sortedFlag = 10000, True
import numpy if listLen <= threshold or listLen <= randLen*2 or not randNum: return (key(numpy.diff(numpy.array(lst)))).all() from random import sample for i in range(randNum):
sortedRandList = sorted(sample(xrange(listLen), randLen))
flag = (key(numpy.diff(numpy.array([lst[x] for x in sortedRandList])))).all()
sortedFlag = sortedFlag and flag return sortedFlag
_rand()藉助隨機采樣降低運算規模,並融入其他判斷函數的優點。例如,猜測列表可能的排序規則,並在隨機采樣不適合時使用相對快速的判斷方式,如NumPy。
通過line_profiler分析可知,第20行和第21行與randLen有關,但兩者耗時接近。因此randLen應小於listLen的一半,以抵消sorted開銷。除內部限制外,用戶可以調節隨機序列個數和長度,如定製單個但較長的序列。
注意,_rand()不適用於存在微量異常數據的長列表。因為這些數據很可能被隨機采樣遺漏,從而影響判斷結果的准確性。
5. python列表有哪些深入的特性
迭代 iterable 里所有內容, 每一次迭代, 都把 iterable 里相應內容放到 iter_var 中, 再在表達式 exp 中應用該 iter_var 的內容, 最後用表達式的計算值生成一個新的列表.
6. 在Python中列表與字元串這兩種數據結構有何區別你認為採用哪種更可靠
字元串是immutable的,list是mutable的
也就是說字元串一旦定義不可改變,list則可以。
eg.
s="abc"
d=['a','b','c']
d.append('e')
而
new_s=s+'e'
而且,
immutable意味著可以作字典的key,而mutable則不可。
此外兩種東西的方法不同。
7. Python 列表
是不是這個list讓你感覺有些困擾呢,你看一下我下面的表示方式:
你的list和我的abc都是表示一個列表名。
del abc[1]:調用系統方法del,刪除列表abc中索引為1的項;
abc.pop():調用列表(這里為abc)本身的方法pop(),刪除abc列表的最後一項。
abc[1]中用方括弧是列表的索引操作,為列表自身的規則;pop()中也可以傳入參數用於表示索引位置,但此處為向方法內傳入位置參數。
方法來源不一樣,使用規則有差別。
8. python中的列表中常用的方法有哪些,分別是什麼作用
Python列表定義:按特定順序排列的元素組成。在Python中,用方括弧[]來表示列表,並用逗號來分隔其中的元素。Python列表是編程中很常見的數據類型 。
列表是一種可修改的集合類型,其元素可以是數字、string等基本類型,也可以是列表、元組、字典等集合對象,甚至可以是自定義的類型。其定義方式如下:>>> nums = [1,2,3,4]>>> type(nums)>>> print nums[1, 2, 3, 4]>>> strs = ["hello","world"]>>> print strs['hello', 'world']>>> lst = [1,"hello",False,nums,strs]>>> type(lst)>>> print lst[1, 'hello', False, [1, 2, 3, 4], ['hello', 'world']]
下面我們來看一下列表中有哪些常見的方法:count():統計某個元素在列表中出現的次數。index():從列表中找出某個值第一個匹配項的索引位置。append():在列表末尾添加新對象。extend():在列表末尾一次性追加另一個序列的多個值。insert():在列表的指定位置插入對象。pop():移除列表中的一個元素(默認最後一個元素),並且返回該元素的值。remove():移除列表中某個值的第一個匹配項。reverse():將列表中的元素反向,不重新拷貝一個列表。reversed():將列表中的元素反向,重新拷貝一個列表。sort():將列表中的元素排序,不重新拷貝一個列表。sortd():將列表中的元素排序,重新拷貝一個列表。():淺拷貝,只是給原來的列表貼上了一個新標簽,對於一個復雜對象的子對象並不會完全復制,如果有子列表,改變原來的值,新的拷貝對象也會改變。deep():深拷貝,將復雜對象的每一層復制一個單獨的個體出來。就是完全拷貝。常見內置函數:max()、min()、sum()、len()、all()、any()、zip()、enumerate()
9. python的元組和列表的區別
元組一旦設定不可改變,試圖改變會出錯
第一條帶來一個好處,就是元組可以用作字典的鍵,可以排列,等等(「因為有了哈希值」)
列表隨意改,長度和內容都可變
10. Python列表操作
1、append()
append()對於列表的操作主要實現的是在特定的列表最後添加一個元素,並且只能一次添加一個元素,並且只能在列表最後;
m.append(元素A)
2、extend()
extend()對於列表的操作主要實現的是對於特定列表的擴展和增長,可以一次添加多個元素,不過也只能添加在列表的最後;
m.extend([元素A,元素B,……])
3、insert()
insert()對於列表的操作主要是在列表的特定位置添加想要添加的特定元素,比較常用,這里的特定位置是指元素所在列表中的位置索引號,需要注意的是這里的索引號都是從0開始的,不是從1開始的,這個大家需要特別注意。
m.insert(A,元素B):表示在列表m裡面的第A+1處加入元素B
1、m.remove()
m.remove的作用是移除掉列表m裡面的特定元素;
m.remove(元素A)
2、del m[n]
它的作用是刪除掉列表裡面的索引號位置為n 的元素,這里需要注意的是del是一種操作語句。
del m[n]
3、m.pop()
它的作用是將列表m的最後一個元素返回,並且在此基礎上進行刪除掉
1、Temp=m[n]
獲取m列表第n+位置處的元素
1、Temp=m[A:B]
表示將m列表裡從索引號位置為A開始的元素到B-1處元素之間的列表獲取賦給temp.
1、+:它主要實現的是多個列表之間的拼接
常見的列表操作符
2、*:主要實現的是列表的復制和添加
3、比較>,<:主要進行數據型列表的元素比較
4、and等:;邏輯運算符,可以進行列表之間的邏輯判斷
1、m.count(A):輸出元素A在列表m裡面出現的次數
2、m.index(A):輸出元素A在列表m裡面的索引位置號
m.index(A,a,b):對於列表m裡麵包含多個元素A時,輸出在列表m索引號a-b之間的特定索引號
3、m.reverse():將列表m進行前後的翻轉,前變後,後變前
4、m.sort():將列表m裡面地數據進行從小到大的排列
5、m.sort(reverse=True):將列表m裡面地數據進行從大到小的排列
其實對於列表m裡面的元素進行從大到小的排列還可以用以下方法:
N=m.sort()
N.reverse()
1) 深拷貝:
M=[A,b,a,c]
N=M[:]
2) 淺拷貝:
N=M