删除列表中从数字 0 的第一次出现到第二次出现的所有项目

Delete all items in list from the first to the second appearance of number 0

提问人:RealGonPC 提问时间:11/14/2023 最后编辑:Goku - stands with PalestineRealGonPC 更新时间:11/14/2023 访问量:117

问:

我尝试删除列表 L 中的所有项目,从列表中第一次出现到第二次出现 0(包括 0)。

L = [int(x) for x in input().split()]
L[L.index(0):L.index((' '.join(L)).find('0',L.index(0)+1))] = []

我收到以下错误:

Traceback (most recent call last):
  L[L.index(0):L.index((' '.join(L)).find('0',L.index(0)+1))] = []
TypeError: sequence item 0: expected str instance, int found

em 0:预期的 str 实例,找到 int

我不明白它为什么以及在哪里需要一个字符串。另外,我该如何解决这个问题?

python-3.x 列表

评论

1赞 slothrop 11/14/2023
举个最小的例子,看看有什么作用。' '.join([1, 2])
1赞 TheLazyScripter 11/14/2023
L[(s:=L.index(0)):L[s+1::].index(0)+s+2]但是,从第一次出现开始,在到达下一次出现时停止循环数组会更实际
0赞 JonSG 11/14/2023
是否总是至少有 2 个项目“0”?
0赞 mkrieger1 11/14/2023
请以文本形式包含错误消息,而不是图像。

答:

1赞 Tharu 11/14/2023 #1

该方法仅适用于字符串,但您正在对整数使用它。您可以通过将其转换为列表来解决此问题。joinstr

L[L.index(0):L.index((' '.join(list(map(str, L)))).find('0',L.index(0)+1))] = [] 

您可以使用该功能轻松地将所有列表转换为列表。mapintstr

list(map(str, L))

评论

1赞 slothrop 11/14/2023
例如,如果 .转换为字符串后,代码会错误地将 的最后一个数字识别为第二个零。L = [5, 0, 7, 10, 0]10
3赞 Goku - stands with Palestine 11/14/2023 #2

从蟒蛇的禅宗

简单胜于复杂。

L = [int(x) for x in input().split()]

# your L is a list where elements are of type int

通过以下方式获取第一个元素:2 indices0

c=0
indices=[]
for idx, x in enumerate(L):
    if x==0:
        indices.append(idx)
        c+=1
    if c==2:
        break

最后,通过切片删除第 1 次和第 2 次出现之间的所有元素:0

L[:indices[0]+1] + L[indices[1]:]
0赞 Timur Shtatland 11/14/2023 #3

一个更 pythonic、更短、更清晰但效率稍低的解决方案:

lst = [int(x) for x in input("Enter integers, delimited by space: ").split()]
# Enter integers, delimited by space: 1 2 3 0 4 5 0 6 7 0 8

idxs = [i for i, x in enumerate(lst) if x == 0]
new_lst = [x for i, x in enumerate(lst) if (i < idxs[0] or i > idxs[1])]

print(new_lst)
# [1, 2, 3, 6, 7, 0, 8]

它使用列表推导式和枚举。它不如悟空的解决方案有效,特别是对于较长的列表,因为它必须遍历整个列表,即使只需要前 2 次出现 0。

0赞 Reilas 11/14/2023 #4

创建两个切片,并将它们连接起来。

下面是一个示例。

l = [ 1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9 ]
l = l[:(x := l.index(0))] + l[(l.index(0, x + 1)) + 1:]
0赞 Suramuthu R 11/14/2023 #5

由于您已将输入转换为列表中的 int,因此 join 方法不起作用。下面是一个更简单、更有效的方法。

l = [int(x) for x in input().split()]
i, c, L = 0, 0, len(l)
while i<L:
    if c==2:break
    if i == 0: c = c +1
    if c != 0: del l[i]; i = i-1; L = L-1
    i += 1


print(l)