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

如果我删除两个删除语句中的一个,它不会给我一个错误,它会1从.[...,1,0,...]0

例如。

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

删除 1 个删除语句后,输出为

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

但是有 2 个删除语句,我得到一个错误。

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 所建议的那样,让我们​​看看为什么这两个删除会导致问题。

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

for 循环的计算结果为for m in range(0, 10)。当我们到达0, m == 6. 10所以我们在位置 * 之前插入5,并删除位置6两次。

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

注意那里只有 9 个元素?len(X[1])in 你的循环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( X)。

于 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 回答