从python中的另一个列表中删除完整列表

从python中的另一个列表中删除完整列表,python,python-2.7,Python,Python 2.7,我有一张单子 x=[1,2,0,0,0,3,0,0,0,0,0,4] 我想减去这个列表 y=[0,0,0] 来自列表x 所以结果应该是 z=[1,2,3,0,0,4] 如何在python中实现这一点? 编辑请注意,我不是在尝试替换,我是在尝试删除在我看来,您需要查找匹配的索引,然后使用切片分配将其替换为零: x=[1,2,0,0,0,3,0,0,0,0,0,4] y=[0,0,0] # Search for all non-overlapping occurences of `y` ix

我有一张单子

x=[1,2,0,0,0,3,0,0,0,0,0,4]
我想减去这个列表

y=[0,0,0]
来自列表x

所以结果应该是

z=[1,2,3,0,0,4]
如何在python中实现这一点?
编辑请注意,我不是在尝试替换,我是在尝试删除

在我看来,您需要查找匹配的索引,然后使用切片分配将其替换为零:

x=[1,2,0,0,0,3,0,0,0,0,0,4]
y=[0,0,0]

# Search for all non-overlapping occurences of `y`
ix = 0
matches = []
while ix < len(x):
    if x[ix:ix + len(y)] == y:
        matches.append(ix)
        ix += len(y)
    else:
        ix += 1

# Replace them with slice assignment.
for ix in reversed(matches):
    x[ix:ix + len(y)] = []

print(x)
x=[1,2,0,0,0,3,0,0,0,0,0,4]
y=[0,0,0]
#搜索“y”的所有非重叠出现`
ix=0
匹配项=[]
当ix
在我看来,您需要查找匹配的索引,然后使用切片分配将其替换为零:

x=[1,2,0,0,0,3,0,0,0,0,0,4]
y=[0,0,0]

# Search for all non-overlapping occurences of `y`
ix = 0
matches = []
while ix < len(x):
    if x[ix:ix + len(y)] == y:
        matches.append(ix)
        ix += len(y)
    else:
        ix += 1

# Replace them with slice assignment.
for ix in reversed(matches):
    x[ix:ix + len(y)] = []

print(x)
x=[1,2,0,0,0,3,0,0,0,0,0,4]
y=[0,0,0]
#搜索“y”的所有非重叠出现`
ix=0
匹配项=[]
当ix
这是我的方法,找到
x[0]
的索引列表,然后删除子列表

x=[1,2,0,0,0,3,0,0,0,0,0,4]
y=[0,0,0]


def sub(x, y):
    for i in [index for index, value in enumerate(x) if value == y[0]]:
        if x[i:i + len(y)] == y:
            x[i:i + len(y)] = [None] * len(y)

    return filter(lambda k: k != None, x)


print sub(x,y)


多亏了@mgilson,我修复了一个bug。

这是我的方法,找到
x[0]
的索引列表,然后删除子列表

x=[1,2,0,0,0,3,0,0,0,0,0,4]
y=[0,0,0]


def sub(x, y):
    for i in [index for index, value in enumerate(x) if value == y[0]]:
        if x[i:i + len(y)] == y:
            x[i:i + len(y)] = [None] * len(y)

    return filter(lambda k: k != None, x)


print sub(x,y)
x=[1,2,0,0,0,3,0,0,0,0,0,4]
y=[0,0,0]
z = []

foundForThisPass = False
indexsSame = []

for a in range (0, len(y)):
  for b in range(0, len(x)):
    if (y[a] == x[b] and foundForThisPass == False):
      indexsSame.append(b)
      foundForThisPass = True

  foundForThisPass = False


i = 0
for a in range (0, len(x)):
  if (a == indexsSame[i]):
    i += 1
  else:
    z.append(x[a])

print(z)


多亏了@mgilson,我修复了一个bug。

这里有一个简单的方法:

x=[1,2,0,0,0,3,0,0,0,0,0,4]
y=[0,0,0]
z = []

foundForThisPass = False
indexsSame = []

for a in range (0, len(y)):
  for b in range(0, len(x)):
    if (y[a] == x[b] and foundForThisPass == False):
      indexsSame.append(b)
      foundForThisPass = True

  foundForThisPass = False


i = 0
for a in range (0, len(x)):
  if (a == indexsSame[i]):
    i += 1
  else:
    z.append(x[a])

print(z)
import json

xs = repr(x)[1:-1]
ys = repr(y)[1:-1]

new_x = json.loads((''.join(xs.split(ys))).replace(',,',','))

下面是一个简单的方法:

import json

xs = repr(x)[1:-1]
ys = repr(y)[1:-1]

new_x = json.loads((''.join(xs.split(ys))).replace(',,',','))

可能的重复可能的重复为了它的价值,这实际上不起作用。。。用
x=[1,2,0,1,2,0]试试;y=[1,2,0]
。结果应该是
[]
,但您得到的是
[1,2,0]
。原因是,在执行第一次切片分配后,列表现在变短,并且在第一次传递中保存的索引不再工作。您可以通过在列表周围添加一个
反向的
呼叫来修复它,不过…@mgilson谢谢您的提醒,您是对的,我已经修复了它。无论如何,这实际上不起作用。。。用
x=[1,2,0,1,2,0]试试;y=[1,2,0]
。结果应该是
[]
,但您得到的是
[1,2,0]
。原因是,在执行第一次切片分配后,列表现在变短,并且在第一次传递中保存的索引不再工作。您可以通过在列表周围添加一个
反向的
呼叫来修复它,不过…@mgilson谢谢您的提醒,您是对的,我已经修复了它。