2013-10-21 38 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