提问人:RealGonPC 提问时间:11/14/2023 最后编辑:Goku - stands with PalestineRealGonPC 更新时间:11/14/2023 访问量:117
删除列表中从数字 0 的第一次出现到第二次出现的所有项目
Delete all items in list from the first to the second appearance of number 0
问:
我尝试删除列表 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
我不明白它为什么以及在哪里需要一个字符串。另外,我该如何解决这个问题?
答:
1赞
Tharu
11/14/2023
#1
该方法仅适用于字符串,但您正在对整数使用它。您可以通过将其转换为列表来解决此问题。join
str
L[L.index(0):L.index((' '.join(list(map(str, L)))).find('0',L.index(0)+1))] = []
您可以使用该功能轻松地将所有列表转换为列表。map
int
str
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 indices
0
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)
评论
' '.join([1, 2])
L[(s:=L.index(0)):L[s+1::].index(0)+s+2]
但是,从第一次出现开始,在到达下一次出现时停止循环数组会更实际