取决于你的优雅定义,以及是否希望做你的问题的标题所说的话(从列表中即不制造新的列表中删除)。
下面的第一个函数通过向后遍历并删除不需要的东西安全地变异现有列表。第二个函数使用list.index
向前迭代,直到找不到标记(IOW是什么Ignacio的答案建议)。第三个功能是第一个功能的修改版本,假设这个问题是从字面上看的,例如, ['foo', 'foo', 1, 2]
减少到[]
,而不是[2]
。
代码:
def inplace_munge_1(alist, query, size):
for i in xrange(len(alist) - 1, -1, -1):
if alist[i] == query:
del alist[i:i+size]
def inplace_munge_2(alist, query, size):
start = 0
while True:
try:
i = alist.index(query, start)
except ValueError:
return
del alist[i:i+size]
start = i
def inplace_munge_3(alist, query, size):
marker = len(alist)
delpos = []
for i in xrange(len(alist) - 1, -1, -1):
if alist[i] == query:
for j in xrange(min(i + size, marker) - 1, i - 1, -1):
delpos.append(j)
marker = i
for j in delpos:
del alist[j]
funcs = [inplace_munge_1, inplace_munge_2, inplace_munge_3]
tests = [
[],
[1],
['foo'],
[1, 2, 3, 'foo', 'a', 'b', 6, 7, 'foo', 'x', 'y'],
['foo', 'foo', 1, 2, 3],
]
fmt = "%-15s: %r"
for test in tests:
print
print fmt % ("Input", test)
for func in funcs:
values = test[:]
func(values, 'foo', 3)
print fmt % (func.__name__, values)
输出:
Input : []
inplace_munge_1: []
inplace_munge_2: []
inplace_munge_3: []
Input : [1]
inplace_munge_1: [1]
inplace_munge_2: [1]
inplace_munge_3: [1]
Input : ['foo']
inplace_munge_1: []
inplace_munge_2: []
inplace_munge_3: []
Input : [1, 2, 3, 'foo', 'a', 'b', 6, 7, 'foo', 'x', 'y']
inplace_munge_1: [1, 2, 3, 6, 7]
inplace_munge_2: [1, 2, 3, 6, 7]
inplace_munge_3: [1, 2, 3, 6, 7]
Input : ['foo', 'foo', 1, 2, 3]
inplace_munge_1: []
inplace_munge_2: [2, 3]
inplace_munge_3: [3]
请出示你到目前为止的代码。 – 2012-01-07 22:33:50
它应该如何处理'[1,'foo',3,'foo',5,6,7]'? – 2012-01-07 22:42:09
这会返回'[1,5,6,7]'我想。用例假定每次出现'foo'后都会遵循两个我们不关心的值。 – Acorn 2012-01-07 22:45:02