在python中删除列表中的主索引位置
我已经为我的CS类设置了一个小任务,在这个任务中,我必须用Python编写一个方法来删除列表中主要索引位置的项,最高可达索引50 我已经尝试生成如下所示的方法,但是当我尝试在方法末尾打印列表时,它应该返回删除了主索引位置中的值的列表,但是它只是返回完整列表(数字1到50) 我的职能:在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
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交东西。这将是他从互联网上得到答案的很好的证据。