在Python中使用while循环遍历列表

时间:2013-10-21 21:19:44

标签: python list loops while-loop

所以我需要有一个while循环,只要list1的最大值大于list2的最小值。现在,我有这个:

    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

但是,无法调用该函数,因为它表示该对象是不可迭代的。有人可以告诉我如何解决这个问题吗?

非常感谢

3 个答案:

答案 0 :(得分:2)

list.remove不返回列表,因此一旦删除第一个值,就将list1和list2变量分配给非可迭代对象,只需更改

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

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

答案 1 :(得分:2)

list.remove()修改了列表并返回None,因此在第一次迭代后,list1list2都将为None。只需从删除行中删除作业:

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

答案 2 :(得分:1)

问题是,list.remove返回None。虽然您可以通过替换list1=list1.remove(...)来轻松解决此问题,但我可以为您提出其他解决方案吗

  • 不要修改list1,list2,因为这会导致错误的代码;
  • 有点快,因为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