2009-05-25 105 views
1

我试图做一个简单的冒泡排序代码来熟悉list/string manip &方法的使用,但由于某种原因,当我尝试迭代列表中的每个值用于删除空白和非整数值,但会跳过一些值。我还没有算到了冒泡排序部分..我找不到这个冒泡排序代码中的逻辑错误

#test data: 45,5j, f,e,s , , , 45,q, 

    if __name__ == "__main__": 
getList = input("Enter numbers separated by commas:\n").strip() 
listOfBubbles = getList.split(',') 
print (listOfBubbles) 
i = 0 
for k in listOfBubbles: 
    listOfBubbles[i] = k.strip() 
    print ("i = {0} -- Checking '{1}'".format(i,listOfBubbles[i])) 
    if listOfBubbles[i] == '' or listOfBubbles[i] == ' ': 
     del listOfBubbles[i] 
     i -= 1 
    else: 
     try: 
      listOfBubbles[i] = int(listOfBubbles[i]) 
     except ValueError as ex: 
      #print ("{0}\nCan only use real numbers, deleting '{1}'".format(ex, listOfBubbles[i])) 
      print ("deleting '{0}', i -= 1".format(listOfBubbles[i])) 
      del listOfBubbles[i] 
      i -= 1 
     else: 
      print ("{0} is okay!".format(listOfBubbles[i])) 
    i += 1 

print(repr(listOfBubbles)) 

输出:

Enter numbers separated by commas: 
45,5j, f,e,s , , , 45,q, 
['45', '5j', ' f', 'e', 's ', ' ', ' ', ' 45', 'q', ''] 
i = 0 -- Checking '45' 
45 is okay! 
i = 1 -- Checking '5j' 
deleting '5j', i -= 1 
i = 1 -- Checking 'e' 
deleting 'e', i -= 1 
i = 1 -- Checking '' 
i = 1 -- Checking '45' 
45 is okay! 
i = 2 -- Checking 'q' 
deleting 'q', i -= 1 
[45, 45, ' ', ' 45', 'q', ''] 

回答

1

如何更Python的方式?

#input 
listOfBubbles = ['45', '5j', ' f', 'e', 's ', ' ', ' ', ' 45', 'q', ''] 
#Copy input, strip leading/trailing spaces. Remove empty items 
stripped = [x.strip() for x in listOfBubbles if x.strip()]  

# list(filtered) is ['45', '5j', 'f', 'e', 's', '45', 'q'] 
out = [] 
for val in filtered: 
    try: 
    out.append(int(val)) 
    except: 
    # don't do anything here, but need pass because python expects at least one line 
    pass 
# out is [45, 45] 

最后,跳转到你正确的答案

out.sort() 

更新 为了澄清通

>>> for i in range(0,5): 
     pass 
     print i 

0 
1 
2 
3 
4 
+0

嗯,这不会为我编译。使用lambda函数的行会出现语法错误。另外,我不明白:x和x!='',第一个参数做什么(在'和'之前)?除此之外,你为什么使用pass而不是继续?还有一个问题,当“过滤”列表通过过滤器到“已过滤”列表时,“已删除”列表是否会从内存中删除? – Justen 2009-05-25 04:13:35

0

决不改变你的循环就非常列表 - 循环for k in listOfBubbles:里面,你删除这个列表中的一些项目,并扰乱内部循环逻辑。有很多替代方法,但最简单的解决方法是循环访问要更改的列表的副本for k in list(listOfBubbles):。可能会有更多的问题,但这是第一个问题。

0

没关系,修复它。我把这个循环从一个..换到.. ..

if __name__ == "__main__": 
    getList = input("Enter numbers separated by commas:\n").strip() 
    listOfBubbles = getList.split(',') 
    print (listOfBubbles) 
    i = 0 
    while i < len(listOfBubbles): 
     listOfBubbles[i] = listOfBubbles[i].strip() 
     print ("i = {0} -- Checking '{1}'".format(i,listOfBubbles[i])) 
     if listOfBubbles[i] == '' or listOfBubbles[i] == ' ': 
      del listOfBubbles[i] 
      i -= 1 
     else: 
      try: 
       listOfBubbles[i] = int(listOfBubbles[i]) 
      except ValueError as ex: 
       #print ("{0}\nCan only use real numbers, deleting '{1}'".format(ex, listOfBubbles[i])) 
       print ("deleting '{0}', i -= 1".format(listOfBubbles[i])) 
       del listOfBubbles[i] 
       i -= 1 
      else: 
       print ("{0} is okay!".format(listOfBubbles[i])) 
     i += 1 

    print(repr(listOfBubbles)) 
0

你不能使用迭代器从列表中删除,因为长度的变化。

相反,您必须在for循环(或while循环)中使用索引。

一旦你删除了一个项目,你需要再次遍历列表。

伪代码:

 
again: 
for i = 0 to list.count - 1 
{ 
    if condition then 
    delete list[i] 
    goto again; 
} 
0

如果你打算同时通过它迭代从列表中删除,以相反顺序遍历清单:

for(i = myList.length - 1; i >= 0; i--) { 
    // do something 
    if(some_condition) { 
     myList.deleteItem(i); 
    } 
} 

这样你就不会跳过任何列表项,因为缩短列表不会影响将来的迭代。当然,上面的代码片断假定list/array类中支持deleteItem方法,并执行相应的操作。