Python 基于特定值删除列表中的索引
我试图解决以下问题: 返回数组中数字的总和,空数组返回0。除此之外,数字13是非常不吉利的,所以它不算数,紧跟在13之后的数字也不算数 这是我的想法,这里的想法是13和1(在它之后)被删除,然后剩余的数字被求和。我的问题是删除部分,它实际上并没有删除任何内容。这是语法问题吗Python 基于特定值删除列表中的索引,python,list,Python,List,我试图解决以下问题: 返回数组中数字的总和,空数组返回0。除此之外,数字13是非常不吉利的,所以它不算数,紧跟在13之后的数字也不算数 这是我的想法,这里的想法是13和1(在它之后)被删除,然后剩余的数字被求和。我的问题是删除部分,它实际上并没有删除任何内容。这是语法问题吗 x = [1,2,2,1,13,1] def sum13(nums): for i in nums: if i == 13: del nums[i:i+1] retu
x = [1,2,2,1,13,1]
def sum13(nums):
for i in nums:
if i == 13:
del nums[i:i+1]
return sum(nums)
print(sum13(x))
20 <-- should be 6
x=[1,2,2,1,13,1]
def sum13(nums):
对于nums中的i:
如果i==13:
德尔努姆斯[i:i+1]
回报总额(nums)
印刷品(sum13(x))
20只要在列表中循环,只需保留一个运行总和和一个上一个值的记录。如果i
不是13
并且前一个不是13
则添加到总和中,无需修改传入的列表
def sum13(nums):
sum = 0
last = None
for i in nums:
if i != 13 and last != 13:
sum += i
last = i
return sum
你的问题在于你的索引i
是列表中的数字,而不是索引。
以下是解决问题的方法:
x = [1,2,2,1,13,1]
def sum13(nums):
for i, num in enumerate(nums):
if num == 13:
del nums[i:i+2] # This removes the index i and the index i+1
return sum(nums)
print(sum13(x))
>>> 6
编辑:
正如Thierry Lathuille在评论中提到的,这并不能充分解释您重复'13'的情况。假设您想要这种行为,下面是一种方法:
def sum13(nums):
for i, num in enumerate(nums):
if num == 13:
stop_cut = i + 1
while nums[stop_cut] == 13:
stop_cut += 1
del nums[i:stop_cut+1]
return sum(nums)
下面是使用递归函数的示例。只要列表中有13
,我们就把它前面的所有内容加起来,把它后面的所有内容加起来
x = [1,2,2,1,13,1]
def sum13(nums, first_call=False):
if not first_call and nums[0] != 13:
nums = nums[1:]
if 13 in nums:
return sum(nums[:nums.index(13)]) + sum13(nums[nums.index(13)+1:])
return sum(nums)
print(sum13(x, True)) # -> 6
请注意,此解决方案适用于相邻的13
s
x = [13, 13, 1]
print(sum13(x, True)) # -> 0
一个问题是您正在使用列表元素值作为索引。这里有一个使用生成器的解决方案。首先确定要忽略的值的索引,然后创建一个排除这些值的新列表
x = [1,2,2,1,13,1]
def sum13(nums):
def filter13(nums):
for n, i in enumerate(nums):
if i == 13:
yield n
yield n + 1
bad_ix = set(filter13(nums))
new_nums = [x for n, x in enumerate(nums) if n not in bad_ix]
return sum(new_nums)
sum13(x)
您确实不应该在迭代列表时从列表中删除它。重建一个新列表。请记住python中的切片是非包容性的,因此nums[4]
和nums[4:5]
都只返回13
和[13]
作者分别说不要计算紧跟在13之后的数字,不是所有数字都在13之后。谢谢@FilipMłynarski误解了这句话。使用x=[13,13,1]
,你得到1,虽然在13之后应该得到0作为1,但不应该计数。@Thierrylahuille实际上从说明中不清楚第二个13是否计数。我添加了一种处理重复13的方法。谢谢你指出这一点