Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_Del - Fatal编程技术网

在python中删除列表中的主索引位置

在python中删除列表中的主索引位置,python,list,del,Python,List,Del,我已经为我的CS类设置了一个小任务,在这个任务中,我必须用Python编写一个方法来删除列表中主要索引位置的项,最高可达索引50 我已经尝试生成如下所示的方法,但是当我尝试在方法末尾打印列表时,它应该返回删除了主索引位置中的值的列表,但是它只是返回完整列表(数字1到50) 我的职能: def listDelete(list): for i in list: if i %2 != 0 & i % 3 != 0: del list[i] ret

我已经为我的CS类设置了一个小任务,在这个任务中,我必须用Python编写一个方法来删除列表中主要索引位置的项,最高可达索引50

我已经尝试生成如下所示的方法,但是当我尝试在方法末尾打印列表时,它应该返回删除了主索引位置中的值的列表,但是它只是返回完整列表(数字1到50)

我的职能:

def listDelete(list):
    for i in list:
        if i %2 != 0 & i % 3 != 0:
            del list[i]
return list
我使用以下方法调用该函数:

listDelete(range(1,50))

我对python非常陌生,因此,如果这是一个非常简单的修复或明显的错误,我深表歉意,但任何帮助都将不胜感激

您应该使用
List
类的
pop
方法,而不是
del
。为了使用pop,您需要列表元素的索引,可以使用
枚举
在for循环中获取该索引:

def listDelete(list):
    for index, value in enumerate(list):
        if value % 2 != 0 and value % 3 != 0:
            list.pop(index)
    return list

print listDelete(range(1,50))
结果:

[2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 26, 27, 28,
 30, 32, 33, 34, 36, 38, 39, 40, 42, 44, 45, 46, 48]

也就是说,您的逻辑没有找到所有素数索引,例如25不是素数,但它不能被2或3整除。

您编写的代码存在两个主要问题。Python作为逻辑和位and运算符,
&
。你可能想了解一下这种差异

同时,你在一个列表上循环,并在循环中更改相同的列表,这不是一个好主意。与其更改输入列表,不如创建一个包含非素数的新列表,然后返回新列表

最后一件事,在这个问题中,你说你想删除素数索引中的值,但你在检查列表中的值,而不是索引中的值(我说“素数”,因为你没有真正检查素数,但我想你知道这一点)。

这怎么样

import numpy as np

def listDelete(list):
    for i in list:
        if (i %2 != 0 and i % 3 != 0):
            list[i] = 0
    return list[np.nonzero(list)]
您可以称之为:

listDelete(np.arange(1,51))

因此,如果我读对了,您需要删除列表中索引为素数的所有项。如果是,您希望:

def deletePrimeIndex(l):
    return [value for index, value in enumerate(l) if index > 1 and not all(index % i for i in range(2, index))]
如果希望值不是素数:

def deletePrimeValue(l):
    return [value for value in l if value > 1 and not all(value % i for i in range(2, value))]
输出:

In  [1]:  print deletePrimeIndex(range(1, 50))
Out [1]:  [5, 7, 9, 10, 11, 13, 15, 16, 17, 19, 21, 22, 23, 25, 26, 27, 28, 29, 31, 33, 34, 35, 36, 37, 39, 40, 41, 43, 45, 46, 47, 49]

In  [2]:  print deletePrimeValues(range(1, 50))
Out [2]:  [4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 38, 39, 40, 42, 44, 45, 46, 48, 49]
注意:使用
范围(1,50)
时,每个值都将比其索引大一位。即:
范围(1,50)[0]
将是
1
而不是
0


而且,从技术上讲,这两种方法都会返回新的列表

您可能需要在问题中添加使用
del
(您提到的)的要求

不管怎样,我会这么做的

def primesTo50():
    '''Generator for prime numbers up to 50'''
    primes = {2, 3, 5, 7, 9, 11 , 13 , 17, 19, 23, 29, 31, 37, 41, 43, 47}
    yield from primes

def delIndices(L, indices, maxIndex = None):
    '''Delete indices of the list up to list length or to the 
    max index if it is provided'''
    if maxIndex is None:
        maxIndex = len(L) - 1
    indices_set = set(sorted(indices)) #don't try to delete the same index twice
    for i in reversed(range(maxIndex + 1)): #must delete in reverse order
        if i in indices_set: #check if i is in the indices to be removed
            try:
                del L[i]
            except IndexError: #ignore error from trying to delete invalid indices
                pass
    return L

#testing
print(delIndices([1,2,3,4], primesTo50(), 50)) # [1, 2]
print(delIndices([1,2,3,4], (0,100), 200)) # [2,3,4]

您也可以这样做素数生成器:

def primes(max):
    '''Generator for prime numbers up to (not including) max'''
    r = range(max)
    for i in r:
        divisors = range(2, i)
        prime = True
        for d in divisors:
            if r%d == 0:
                prime = False
                break
        if prime:
            yield i

还有很多其他的,;我只是很快就完成了(而且还没有测试过——我确信它非常慢)。生成素数在数论中是它自己的领域,所以在我看来,你最好只列出50个素数,就像我上面所做的那样

return
语句的缩进是否如图所示?是的,我的return语句是否应该缩进?因此您试图删除具有素数索引或素数值的项?现在您正在查看它们的值。我非常确定
如果我%2!=0&i%3!=0:
不是识别素数的正确公式…不要将
列表
用作变量名。它与内置的Python关键字冲突,我忘了在函数的条件中添加del语句,抱歉。但是谢谢你指出我逻辑上的缺陷-新手错误
del list[index]
list.pop(index)
的作用相同,只是它不是一个表达式,并且不返回索引处的值。此外,由于删除的单元格会改变后面单元格的索引,因此会出现一个问题。因为问题没有提到numpy,所以最好给出不使用numpy的答案。这可以在没有numpy的情况下轻松完成,我们无法知道讲师是否会接受使用外部库的解决方案。此外,由于这是一个家庭作业问题,最好不要完全给出答案。很抱歉,我错过了这是一个家庭作业问题。我的答案很糟糕,我已经更新了一点。但是是的,他可能不想在没有指示的情况下用numpy交东西。这将是他从互联网上得到答案的很好的证据。