2013-10-21 60 views
1

所以我需要一個while循環,只要list1的最大值大於list2的最小值,就會運行while循環。現在,我有這個:在Python中使用while循環遍歷列表

count=0 
    list1= mine 
    list2= friend 
    while max(list1)>min(list2): 
     count+=1 
     list1= list1.remove(max(list1)) 
     list2= list2.remove(min(list2)) 
    return count 

但是,函數不能被調用,因爲它說對象是不可迭代的。有人能告訴我如何解決這個問題嗎?

謝謝你這麼多

回答

2

list.remove不會返回列表,所以一旦你刪除的第一個值,分配給在List1和List2變量非可迭代的對象,簡單地改變

list1= list1.remove(max(list1)) 
list2= list2.remove(min(list2)) 

list1.remove(max(list1)) 
list2.remove(min(list2)) 
2

list.remove()修改列表到位,並返回None,所以第一個迭代後兩者list1list2將是None。只需從刪除行刪除分配:

while max(list1)>min(list2): 
    count+=1 
    list1.remove(max(list1)) 
    list2.remove(min(list2)) 
1

問題是,list.remove回報None。雖然您可以easely解決這個問題通過更換list1=list1.remove(...),我可能會建議您其他的解決方案,

  • 不修改列表1,列表2,因爲這可能會導致一個bug的代碼;
  • 是快一點,因爲list.remove不是很有效

建議代碼:

import timeit 
from itertools import izip_longest 

def via_remove(l1, l2): 
    count = 1 
    while max(l1)>min(l2): 
     count+=1 
     l1.remove(max(l1)) 
     l2.remove(min(l2)) 
    return count 

def with_itertools(l1, l2): 
    c = 1 
    for l1_max, l2_min in izip_longest(sorted(l1, reverse=True), sorted(l2)): 
     if l1_max <= l2_min: 
      break 
     c += 1 
    return c 

print timeit.timeit('from __main__ import via_remove; via_remove(range(1000), range(1000))', number=100) 
7.82893552113 

print timeit.timeit('from __main__ import with_itertools; with_itertools(range(1000), range(1000))', number=100) 
0.0196773612289