1

所以我需要有一个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

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

非常感谢你

4

3 回答 3

2

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

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

list1.remove(max(list1))
list2.remove(min(list2))
于 2013-10-21T21:22:22.783 回答
2

list.remove()就地修改列表并返回None,因此在第一次迭代后两者都是list1和。只需从删除行中删除分配:list2None

while max(list1)>min(list2):
    count+=1
    list1.remove(max(list1))
    list2.remove(min(list2))
于 2013-10-21T21:22:54.380 回答
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
于 2013-10-21T21:56:58.840 回答