从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谢谢您的提醒,您是对的,我已经修复了它。