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

时间:2015-02-19 17:19:01

标签: 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]
return list

我使用以下方法调用该函数:

listDelete(range(1,50))

我是python的新手,如果这是一个非常简单的修复或明显的错误,请道歉,但任何帮助都会非常感激!

5 个答案:

答案 0 :(得分:1)

而不是del,您应该使用pop类的List方法。要使用pop,您需要使用enumerate在for循环中获取的list元素的索引:

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整除。

答案 1 :(得分:0)

您编写的代码存在两个主要问题。 Python既是逻辑又是按位和运算符and&。您可能想了解差异。

此外,您循环遍历列表并在循环中更改相同的列表,这不是一个好主意(take a look at the last example in this section)。如何而不是更改输入列表,只需创建一个包含非素数的新列表并返回新列表?

最后一件事,你在问题中要删除素数指数的值,但你要检查列表值的“原始性”,而不是指数(我说“素数”,因为你'不是真的在检查素数,但我认为你知道这一点。

答案 2 :(得分:0)

怎么样?

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))

答案 3 :(得分:0)

因此,如果我正确地阅读了您,您需要删除列表中具有素数的INDEX的所有项目。如果是这样,你想要这个:

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]

注意:当您使用range(1, 50)时,每个值都将比其索引大一位数。 IE:range(1, 50)[0]将是1而不是0

此外,这两个技术上都会返回新列表。

答案 4 :(得分:0)

您可能希望在问题中添加使用del(您提到in your comment)的要求。

无论如何,我在这里是怎么做的。

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

还有很多其他much better solutions to this problem;我只是快速地掀起了这个(并且没有对它进行测试 - 我确定它非常慢)。生成素数是数论中自己的领域,所以IMO你只需要像我上面那样列出高达50的素数就会好得多。