每次在气泡排序中传递时,我如何打印出列表的状态



我有一个关于如何在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-1i而不是ii+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 == Falseif 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()

最新更新