-1

重複の可能性:
for ループを while ループに変換する

def splitList(myList, option):
    snappyList = []
    for i in myList:
        if option == 0:
            if i > 0:
                snappyList.append(i)
        if option == 1:
            if i < 0:
                snappyList.append(i)
    return (snappyList)

こんにちは、私は for ループの下でうまく機能するこのコードを持っています。ユーザーが入力した内容に基づいて、正または負の要素を返します。これをwhileループの下で機能させる必要がありますが、whileループに巻き込まれることなく機能させる方法がわかりません。

アイデアやヒントをいただければ幸いです。

4

6 に答える 6

1

あなたの質問に厳密に従わないために反対票を集める危険を冒して、Python は他の多くの伝統的な言語よりも (単純な) ループのための優れた機能を備えています。(また、今朝非常によく似た質問があったことに基づいて、これは宿題かもしれないことにも気づきました)。ループがどのように機能するかを学ぶことwhileには、明らかに何らかの価値がありますが、Python でそれを行うと、他の機能がわかりにくくなります。たとえば、単一のリスト内包表記を使用した例:

def splitList2(myList, option):
    return [v for v in myList if (1-2*option)*v > 0]

print(splitList2([1,2,3,-10,4,5,6], 0))
print(splitList2([1,2,3,-10,4,5,6], 1))

出力:

[1, 2, 3, 4, 5, 6]
[-10]
>>> 

option効果へのマッピングが貧弱であるため、理解における条件文の構文は複雑に見えるだけです。Python では、他の多くの動的言語や関数型言語と同様に、比較関数を直接渡すことができます。

def splitList3(myList, condition):
    return [v for v in myList if condition(v)]

print(splitList3([1,2,3,-10,4,5,6], lambda v: v>0))
print(splitList3([1,2,3,-10,4,5,6], lambda v: v<0))
print(splitList3([1,2,3,-10,4,5,6], lambda v: v%2==0))

[1, 2, 3, 4, 5, 6]
[-10]
[2, -10, 4, 6]
>>>     

それがどれほど柔軟であるかに注意してください。コードを完全に異なるフィルター条件に適応させることは簡単になります。

于 2012-09-27T02:03:58.067 に答える
1

次のことを試してください。

def splitList(myList, option):
    snappyList = []
    i = 0
    while i < len(myList):
        if option == 0:
            if myList[i] > 0:
                snappyList.append(myList[i])
        if option == 1:
            if myList[i] < 0:
                snappyList.append(myList[i])
        i+=1
    return (snappyList)
于 2012-09-27T01:32:46.123 に答える
0
def splitList(myList, option):
    snappyList = []
    myList_iter = iter(myList)
    sentinel = object()
    while True:
        i = next(myList_iter, sentinel)
        if i == sentinel:
            break
        if option == 0:
            if i > 0:
                snappyList.append(i)
        if option == 1:
            if i < 0:
                snappyList.append(i)
    return (snappyList)

または、番兵の代わりに例外ハンドラーを使用することもできます

def splitList(myList, option):
    snappyList = []
    myList_iter = iter(myList)
    while True:
        try:
            i = next(myList_iter)
        except StopIteration:
            break
        if option == 0:
            if i > 0:
                snappyList.append(i)
        if option == 1:
            if i < 0:
                snappyList.append(i)
    return (snappyList)
于 2012-09-27T01:42:52.370 に答える
0

リストをフィルタリングするだけでなく、実際にリストを分割する簡潔な方法を次に示します。

from operator import ge,lt
def splitlist(input, test=ge, pivot=0):
    left = []
    right = []
    for target, val in (((left if test(n, pivot) else right), n) for n in input):
        target.append(val)

    return left, right

for ループを使用していることに注意してください。これが正しい方法だからです。

于 2012-09-27T04:05:48.550 に答える
0
def splitList(myList, option):
    snappyList = []
    myListCpy=list(myList[:]) #copy the list, in case the caller cares about it being changed, and convert it to a list (in case it was a tuple or similar)
    while myListCpy:  #There's at least one element in the list.
        i=myListCpy.pop(0)  #Remove the first element, the rest continues as before.
        if option == 0:
            if i > 0:
                snappyList.append(i)
        if option == 1:
            if i < 0:
                snappyList.append(i)
    return (snappyList)
于 2012-09-27T01:34:41.857 に答える
0
def splitList(myList, option):
    snappyList = []
    while len(myList) > 0:
        i = myList.pop()
        if option == 0:
            if i > 0:
                snappyList.append(i)
        if option == 1:
            if i < 0:
                snappyList.append(i)
    return snappyList
于 2012-09-27T01:36:37.803 に答える