2

課題:

splitList(myList, option)リストと、0 または 1 のいずれかのオプションを入力として受け取る関数を記述します。オプションの値が 0 の場合、関数は myList 内の負の要素で構成されるリストを返します。オプションの値が 1 の場合、この関数は、偶数である myList 内の要素で構成されるリストを返します。

数値が偶数か負かを判断する方法を知っています。「オプション」に基づいて負数または偶数の新しいリストを返す方法に苦労しています

これは私がこれまでに得たものです:

def splitList(myList):
    newlist = []
    for i in range(len(myList)):
        if (myList[i]%2 == 0):
           newlist.append(myList [i])
    return newlist

このプログラムでは、次のエラーが発生します。

Traceback (most recent call last): File "<string>", line 1, in <fragment> 
builtins.TypeError: splitList() takes exactly 1 positional argument (4 given)
4

6 に答える 6

2

コメントで述べたように、インデントを標準化する必要があります。4 つのスペースは Python の標準です。通常は、タブの代わりに 4 つのスペースを挿入するようにエディターを設定できます (タブとスペースを混在させたくありません)。

実際の質問については、3 つの合計関数を作成してみてください。1 つはすべての負の値を返し、もう 1 つは偶数の値を返し、もう 1 つは に基づいて適切な関数を呼び出しますoption

def splitlist(myList, option):
    if option == 1:
        return get_even_elements(myList)
    elif option == 0:
        return get_negative_elements(myList)

def get_even_elements(myList):
    pass # Implementation this method here.

def get_negative_elements(myList):
    pass # Implementation this method here.

# Test it out!
alist = [-1, 2, -8, 5]
print splitlist(alist, 0)
print splitlist(alist, 1)
于 2013-03-07T19:16:25.883 に答える
0

私の以前の答えは間違っていました、そして私が口を開く前に私は本当にテストするべきでした... Doh !!! 生活し、学びます...

編集

あなたのトレースバックはあなたに答えを与えています。リストを引数リストとして読み取っています。それを回避するための超pythonicな方法があるかどうかはわかりませんが、名前付き引数を使用できます。

splitList(myList=yourList)

また

splitList(myList=(1,2,3))

また

splitList(myList=[1,2,3])

しかし、あなたの問題は本当におそらく

splitList(1,2,3,4)  # This is not a list as an argument, it is a list literal as your 'args' list

これは次の方法で解決できます:

splitList([1,2,3,4])

また

splitList((1,2,3,4))

これはあなたが得るトレースバックですか?

Traceback (most recent call last):
  File "pyTest.py", line 10, in <module>
    print splitList(aList,1)
TypeError: splitList() takes exactly 1 argument (2 given)

エラーはおそらく問題を示しています。これは、メソッドが1つの引数しか受け取らないことですが、要件の状態のように2つの引数を渡してみました。

于 2013-03-07T19:29:22.113 に答える
0

コードをそのまま試してみましたが、正の整数のリストを渡してもエラーが発生しなかったため、プログラムが「クラッシュ」している理由がわかりません。他の何かがデバッグを妨害しているのではないかと思います。(ただし、他の人が言っているように、実際にはすべてのインデントレベルで同じ数のスペースを使用する必要があります。)

これが私が入力したものです:

def splitList(myList):
    newlist = []
    for i in range(len(myList)):
        if (myList[i]%2 == 0):
           newlist.append(myList [i])  # Only 3-space indent here
    return newlist

print splitList([1, 2, 3, 4, 5])

私がそれを実行するとき:

[2, 4]

メソッドを呼び出す方法と正確なエラーメッセージを表示できますか?

于 2013-03-07T19:30:03.887 に答える
0

Henry Keiter のコメントは正しかった。前にスペースを 1 つ追加するnewlist.append(myList [i])だけで問題なく動作します。

または、教師が許可する場合は、スペースの代わりにタブを使用して、この問題を完全に回避することもできます (同じファイルで両方を使用しないように注意してください)。

于 2013-03-07T19:16:51.890 に答える
0
def splitList(myList, option):
    return [i for i in myList if i<0] if option==0 else [i for i in myList if i>0]


# test
>>> myList=[2, 3, -1, 4, -7]
>>> splitList(myList, 0)
[-1, -7]
>>> splitList(myList, 1)
[2, 3, 4]
>>> 
于 2013-03-07T19:27:16.510 に答える
-6

編集

splitList メソッドを呼び出しているコードを表示できますか?

これは間違っていました

myList [i]

そこにスペースを入れることはできません。Pythonは構文に関して非常に非常に厳格です

人々は私に反対票を投じるべきだと考えているようだったので、説明させてください。

そのスペースを確保することで、効果的に myList (リスト) と [i] (インデックス 0 に 'i' の値を持つリスト リテラル) を指定できます。

そのため、2 つの変数 (1 つの実際の変数と 1 つのリテラル) を追加メソッドに渡していますが、コンマで区切られていません。これは機能しません。

于 2013-03-07T19:13:18.157 に答える