1

そのため、list1 の最大値が list2 の最小値より大きい限り実行される 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

ただし、オブジェクトが反復不可能であると示されているため、関数を呼び出すことはできません。誰かがこれを修正する方法を教えてもらえますか?

どうもありがとうございました

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ので、最初の繰り返しの後、 と の両方がlist1list2なりますNone。remove 行から割り当てを削除するだけです。

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 に答える