2

配列X[1]があります。その配列で、要素[...、1,0、...]を[....、10、..]に置き換えたいと思います。つまり、1と0が連続して発生する場合は常に、10に置き換えたいと思います。

私のコードは、

for m in range(0,len(X[1])):

    if X[1][m] == 0:
        X[1].insert(m-1,10)
        del X[1][m]
        del X[1][m]

しかし、このコードは私にエラーを与えます:

Traceback (most recent call last):
  File "gettinginput.py", line 25, in <module>
    if X[1][m] == 0:
IndexError: list index out of range

2つのdeleteステートメントの1つを削除しても、エラーは発生せず、1から削除されます[...,1,0,...]が、が残ります0

例えば。

X[1] = [5, 4, 4, 5, 7, 1, 0, 3, 2, 1]

1つのdeleteステートメントを削除すると、出力は次のようになります。

[5, 4, 4, 5, 7, 10, 0, 3, 2, 1]

しかし、2つのdeleteステートメントを使用すると、エラーが発生します。

4

3 に答える 3

2
def reduce_list(lst, match, replace):
    _matchlen = len(match)
    lst = list(lst)                      # copy existing list
    for i in xrange(len(lst)-_matchlen, -1, -1):   # scan through it backwards
        if lst[i:i+_matchlen] == match:
            lst[i:i+_matchlen] = replace
    return lst

print reduce_list([1,0,1,0,1,1,0], [1,0], [10])

結果は

[10, 10, 1, 10]

あなたの例に合わせて、

X[1] = reduce_array(X[1], [1,0], [10])

編集:もう少し考えた後、

def reduce_list(lst, match, replace):
    """
    Return a new list,
    with all original non-overlapping occurrences of 'match'
    replaced by 'replace'
    """
    lst = list(lst)                      # copy existing list
    matchlen = len(match)
    replacelen = len(replace)
    last_i = len(lst) - matchlen
    i = 0
    while i <= last_i:
        if lst[i:i+matchlen] == match:
            lst[i:i+matchlen] = replace
            last_i += replacelen - matchlen
            i += replacelen
        else:
            i += 1
    return lst
于 2012-06-11T19:46:41.787 に答える
1

ループの最初の繰り返しで、m == 0. 次に、 に挿入しますm-1。これは になりますが-1、これは確実に の範囲外ですX[1]

for m in range(0,len(X[1])):
    if X[1][m] == 0:
        X[1].insert(m-1,10)
        del X[1][m]
        del X[1][m]

編集: 入力が a で始まる場合0、私の元の答えは有効です。OPが示唆するように決してそうしないと仮定して、2つの削除が問題を引き起こす理由を見てみましょう.

X[1] = [5, 4, 4, 5, 7, 1, 0, 3, 2, 1]

for ループは に評価されfor m in range(0, 10)ます。に到達する0と、m == 6. したがって、position * の10前に挿入し、position を2 回削除します。56

X[1] = [5, 4, 4, 5, 7, 10, 3, 2, 1]

そこには 9 つの要素しかないことに注意してください。ループ内len(X[1])決して再評価されないため、配列の最後で実行され、範囲外のエラーが発生します。for

テストプログラム:

>>> for m in range(len(x)):
...     del(x[m])
...     print(len(x))
...
8
7
6
5
4
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list assignment index out of range


* なぜポジション 5 の前に? の定義からinsert

list.insert(i, x)

指定された位置にアイテムを挿入します。最初の引数は挿入する要素のインデックスであるため、 a.insert(0, x) はリストの先頭に挿入し、 a.insert(len(a), x) は a.append( と同等です。バツ)。

于 2012-06-11T19:31:47.533 に答える
1

これが簡単な方法です。

lst=[5, 4, 4, 5, 7, 1, 0, 3, 2, 1]

for idx,val in enumerate(lst[:-1]):
    if(val==1 and lst[idx+1]==0):
        lst[idx:idx+1]=[10]

print (lst)

またはなしenumerate:

for idx in range(len(lst)-1):
    if(lst[idx:idx+1]==[1,0]):
        lst[idx:idx+1]=[10]

print (lst)

サブリスト [1,0] を探してリストを検索し、そのサブリストを (サブ) リスト [10] に置き換えます。

もちろん、これをすべて行う前に、リストのリスト ( ) を呼び出したときに、次の代わりにX行うことができます。lst=X[1]lst=[...]

于 2012-06-11T19:42:19.453 に答える