當前位置:首頁 » 編程語言 » pythonif列表

pythonif列表

發布時間: 2022-02-23 05:37:01

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()不適用於存在微量異常數據的長列表。因為這些數據很可能被隨機采樣遺漏,從而影響判斷結果的准確性。

Ⅱ python 判斷列表中每個元素有幾個

比如你可以這樣(用isinstance()函數來判斷類型):
123456789intCount = 0 #用來記錄列表中的int元素個數listCount = 0 #記錄list元素個數a = [1,'a',2,[1,2]]for i in a: #遍歷a if isinstance(i,int): #判斷i是不是int intCount += 1 elif isinstance(i,list): #判斷i是不是list listCount += 1print(intCount,listCount)
結果是2 1,也就是有2個int元素,1個list元素。
這是一個思路,你可以根據需要添加判斷的類型,比如要統計float類型,就可以再加個elif isinstance(i,list)來進行統計。至於元素種類,對應的記錄是0,就說明沒有這個種類的元素,比如如果intCount是0,就說明列表中沒有int元素。

Ⅲ python中 非空列表怎麼表示(判斷)

方法:

使用len函數獲取列表的長度,用if函數判斷這個列表的長度是否不為零,如果列表的長度不為零,就表示這個列表為非空列表

執行結果如下:

更多Python知識,請關註:Python自學網!!

Ⅳ python if 語句和列表結合求解

defselect_data(list):

defcheck_pass(fname,surname):
'''這里做成一個函數,直觀一點'''
forrecinlist:
ifstr(rec[1])==fnameandstr(rec[0])==surname:
returnTrue
returnFalse
#check_pass結束
#加一個flag作為標記,通過檢查(is_pass為True)就結束了
is_pass=False
whilenotpass:
first_name=str(input('Inputfirstname'))
surname=str(input('Inputsurname'))
is_pass=check_pass(first_name,surname)

Ⅳ python 列表的條件判斷

importitertools
a=[3,4,5]
b=[3,5]
#查找[3,5]in[3,4,5]
print'bisina:',tuple(b)inlist(itertools.combinations(a,2))


#查找[3,5]in[3,4,5]以及[5,3]in[3,4,5]
a=[3,4,5]
b=[5,3]
print'bisina:',tuple(b)inlist(itertools.permutations(a,2))#數字2根據你的b列表的長度而定如果長度是2就填2是3就填3

Ⅵ python 判斷某個列表中的所有元素在另一個列表中

你這個標題怎麼跟內容不一致。

判斷一個列表中的元素是否都在另一個列表中,用集合就可以了。

>>>l1=['a','b','c']
>>>l2=['d','b','c','a']
>>>set(l1).issubset(set(l2))
True
>>>

Ⅶ Python 列表為判斷條件

首先,yield是用來生成迭代器,必須與函數使用,如何取yield生成器的值,一般使用for i in 一個由yield構造的函數,例如

defa():

foriinrange(10):
yieldi
b=a()
foriinb:
printi

然後elif block的邏輯判斷條件是elif block is notNone:#簡單的說就是block不為空,上面的是列表,意思是列表block不為空。

Ⅷ 在python編程中 if users_list: 是什麼意思 if後面的判斷不應該有條件嘛 這只是一個變數哇

if users_list: 等效於 if bool(users_list):

Ⅸ python判斷元素是否在列表組中

  • locals()函數會以字典類型返回當前位置的全部局部變數。

  • 對於函數, 方法, lambda 函式, 類, 以及實現了 __call__ 方法的類實例, 它都返回 True。

def chuli():
list1 = ['A', 'B1', 'C', 'D6', 'E2', 'F4']
list2 = ['G', 'H', 'K45', 'J4', 'K', 'L7']
list3 = ['M3', 'N', 'O5', 'P', 'Q43', 'R']
# 在這里有100個列表
list100 = ['S2', 'W5', 'R8', 'T', 'W', 'E']

# locals() 函數會以字典類型返回當前位置的全部局部變數。
# 對於函數, 方法, lambda 函式, 類, 以及實現了 __call__ 方法的類實例, 它都返回 True。
dc = locals()

for key, val in dc.items():
if 'K45' in val:
print(key)

chuli()

Ⅹ python中的if判斷語句怎麼寫

python中寫if判斷語句的方法:
1、創建一個一維列表
2、通過for循環來遍歷列表的每一個元素。
3、用if語句判斷等於7的元素,如果元素等於7,列印這個元素
結果如下:

熱點內容
php參數變數 發布:2025-01-09 10:42:06 瀏覽:661
桃花怎樣存儲 發布:2025-01-09 10:33:44 瀏覽:700
解壓縮好卡 發布:2025-01-09 10:18:16 瀏覽:795
物資補給站我的世界伺服器 發布:2025-01-09 10:18:09 瀏覽:66
伺服器ip顯示泛播 發布:2025-01-09 10:10:34 瀏覽:717
緩存火影圖片 發布:2025-01-09 10:05:00 瀏覽:650
設置消費密碼驗證的渠道是什麼 發布:2025-01-09 09:59:21 瀏覽:872
小米9域名伺服器地址 發布:2025-01-09 09:59:14 瀏覽:611
各類資料庫 發布:2025-01-09 09:58:30 瀏覽:257
php判斷進制 發布:2025-01-09 09:54:44 瀏覽:285