【问题标题】:How do I print out everytime the state of the list every time you make a pass in bubble sort?每次通过冒泡排序时,我如何打印出列表的状态?
【发布时间】:2016-06-28 20:34:58
【问题描述】:

我有一个关于如何在 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 而不是 i,i+1 吗?

【问题讨论】:

  • 您的意思是替换您访问列表项的方式(访问为i-1,i 而不是i,i+1)?
  • 是的。这就是我想做的,但我不知道如何去做。我尝试了不同的方法,但似乎并没有遍历整个列表。

标签: list python-2.7 sorting for-loop bubble-sort


【解决方案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

你是这个意思,对吧?

【讨论】:

  • 非常感谢。这对我帮助很大。您在代码之前的解释会有所帮助。
  • 没问题。如果对您有用,请接受答案。
  • 我不想颠倒循环的顺序。我已经改写了我的问题以使其更好。很抱歉造成误解。
  • 已更新答案。检查您的意思是否相同。
  • @R.Yamada : 看起来不错吗?
【解决方案2】:

使用 range 方法的特性,允许您以相反的顺序进行迭代

print range(1,3) # [1,2]
print range(3-1, 0, -1) # [1,2]

顺便说一句,您可以避免代码重复循环(if asc == Falseif asc == True 删除条件)。

使用下面的函数(我添加了 cmets):

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()

【讨论】:

  • 谢谢。你的描述真的很容易理解。我已经了解了更多关于 python 编程的知识。
  • @R.Yamada 欢迎您 :) 希望这对您有用!另外,您可以在那里查看我的答案:stackoverflow.com/questions/7286365/…,它包含特别用于使用range 方法获取反转数组的描述:) 祝你有美好的一天!
  • 当我尝试运行程序时,出现错误。 UnboundLocalError:分配前引用了局部变量“comparison_result”。你知道为什么会这样吗?
  • @R.Yamada 这意味着您正在尝试使用变量,然后再分配给它一些值。你可以看看stackoverflow.com/questions/855493/…它有更多的解释...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多