我有一个关于如何在python 2.7中获取以下输出的问题。
>> bubble(['abe','Ada','bak','bAr'], False)
['Ada', 'bak', 'bAr', 'abe']
['bak', 'bAr', 'Ada', 'abe']
['bAr', 'bak', 'Ada', 'abe']
>> bubble(['Adm','abe','bAr','bak'], False)
['Ada','bAr','bak','abe']
['bArt','bak','Ada','abe']
函数的输入如下。字符串 (L) 和布尔值的列表,表示字母升序 (asc=True) 或字母降序 (asc=False)。在这两种情况下,它都是按字典顺序排列的。我想在每次有通行证时打印出列表的状态。
def bubble(L, asc):
n = len(L)
if asc == False:
for i in range(1,n):
for ii in range(n-i):
if L[ii].upper()<L[ii+1].upper():
tmp=L[ii]
L[ii]=L[ii+1]
L[ii+1]=tmp
print L
if asc == True:
for i in range(1,n):
for ii in range(n-i):
if L[ii].upper()>L[ii+1].upper():
tmp=L[ii]
L[ii]=L[ii+1]
L[ii+1]=tmp
print L
此外,我可以将我当前访问列表项目的方式替换为i-1
和i
而不是i
,i+1
?
在内部循环结束后打印它。
def bubble(L, asc):
n = len(L)
if asc == False:
for i in range(1,n):
for ii in range(n-i):
if L[ii].upper()<L[ii+1].upper():
tmp=L[ii]
L[ii]=L[ii+1]
L[ii+1]=tmp
print L
if asc == True:
for i in range(1,n):
for ii in range(n-i):
if L[ii].upper()>L[ii+1].upper():
tmp=L[ii]
L[ii]=L[ii+1]
L[ii+1]=tmp
print L
对于答案的第二部分,您可以使用您的内部循环
for ii in range(n-1,i,-1).
//这将以相反的顺序运行循环。
for i in range(1,n):
for ii in range(n-1,0,-1):
if L[ii-1].upper()<L[ii].upper():
tmp=L[ii-1]
L[ii-1]=L[ii]
L[ii]=tmp
你的意思是这个,对吧?
使用范围法的功能,允许您以相反的顺序迭代
print range(1,3) # [1,2]
print range(3-1, 0, -1) # [1,2]
顺便说一下,您可以避免循环的代码重复(if asc == False
和if asc == True
删除条件)。
为此,请使用下面的功能(我添加了注释):
def bubble(L, asc=False):
n = len(L)
# passing -1 as lest argument of range is allow to iterate in reverse order
for i in range(n-1, 0, -1):
for ii in range(n-1-i, 0, -1):
# you assign boolean value which depends on `asc` param to comparison_result
comparison_result = L[ii-1].upper() > L[ii].upper() if asc else L[ii-1].upper() < L[ii].upper()
# check bool of comparison_result
if comparison_result:
tmp=L[ii-1]
L[ii-1]=L[ii]
L[ii]=tmp
print L
print bubble(['1', 'a', 's'])
线
comparison_result = if asc else L[ii-1].upper() < L[ii].upper()
相当于:
if asc:
comparison_result = L[ii-1].upper() > L[ii].upper()
else:
comparison_result = L[ii-1].upper() < L[ii].upper()