Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于特定值删除列表中的索引_Python_List - Fatal编程技术网

Python 基于特定值删除列表中的索引

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

我试图解决以下问题:

返回数组中数字的总和,空数组返回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]
    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的方法。谢谢你指出这一点