0

リストのリストのカスタム変換を作成しようとしています。サブリストに対して算術演算を実行しようとしていますが、うまくいきません。これが私のコードです:

def my_transform(seq):
    new_seq = []
    new_seq[0] = seq[0] + 100
    new_seq[1] = seq[1] - 1
    new_seq[2] = seq[2] * seq[2]
    return new_seq

my_list = [[1,2,3], [4,5,6]]

new_list = map(my_transform, my_list) # error
# ideal output:
#[[101,1,9], [104,4,36]]

しかし、次のエラーが表示されます。

Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
map(my_transform,my_list)
File "<pyshell#7>", line 3, in my_transform
new_seq[0] = seq[0] + 100
IndexError: list assignment index out of range

私も試しました:

[my_transform(L) for L in my_list]

それも私に同じエラーを与えました。マップやリストの理解を使用して結果を取得するにはどうすればよいですか? ありがとう!

ポール

4

3 に答える 3

4

問題はあなたの機能にあります。

new_seq[0]リストの最初の要素を参照しようとしますが、そこにないため、エラーが発生します。これを修正するにnew_seqは、元のリストの長さを変更するか、 を使用appendしますが、より簡単な解決策は、中間リストをまったく使用しないように関数を変更することです。

def my_transform(seq):
    return [seq[0] + 100, seq[1] - 1, seq[2] * seq[2]]

この関数を試してみると、うまくいくことがわかります。

>>> my_list = [[1,2,3], [4,5,6]]
>>> map(my_transform, my_list)
[[101, 1, 9], [104, 4, 36]]
于 2013-04-15T04:10:40.987 に答える
2

これは、要素 0、1、および 2 が定義されていないためです。次のように記述できます。

def my_transform(seq):
    new_seq = []
    new_seq.append(seq[0] + 100)
    new_seq.append(seq[1] - 1)
    new_seq.append(seq[2] * seq[2])
    return new_seq
于 2013-04-15T04:11:10.457 に答える
2

問題は、新しいリストが空で始まることです。そのため、存在しないアイテムにアクセスしようとするとインデックスエラーが発生します。0これを修正するためにプレースホルダーで埋めました:

>>> my_list = [[1,2,3], [4,5,6]]
>>> def my_transform(seq):
        new_seq = [0] * len(seq)
        new_seq[0] = seq[0] + 100
        new_seq[1] = seq[1] - 1
        new_seq[2] = seq[2] * seq[2]
        return new_seq

>>> map(my_transform, my_list)
[[101, 1, 9], [104, 4, 36]]

seqまたは、次のようにコピーして初期化することもできます。

new_seq = list(seq)
于 2013-04-15T04:09:31.017 に答える