pythonif列表
Ⅰ 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,打印这个元素
结果如下: