1

我已经为我的 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很陌生,如果这是一个非常简单的修复或明显的错误,我深表歉意,但任何帮助将不胜感激!

4

5 回答 5

1

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

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

于 2015-02-19T17:32:00.377 回答
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

这个问题还有很多其他更好的解决方案;我只是很快就完成了这个(而且还没有测试过——我敢肯定它很慢)。生成素数是数论中它自己的领域,所以 IMO 你最好只列出最多 50 个素数,就像我上面所做的那样。

于 2015-02-19T18:57:38.090 回答
0

因此,如果我没看错,您需要删除列表中所有索引为质数的项目。如果是这样,你想要这个:

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]不会10

此外,从技术上讲,这两者都确实返回了新列表。

于 2015-02-19T17:59:25.503 回答
0

您编写的代码有两个主要问题。Python 作为逻辑运算符和按位运算符,and以及&. 您可能想了解不同之处。

此外,您正在循环一个列表并在循环中更改同一个列表,这不是一个好主意(看看本节中的最后一个示例)。与其更改输入列表,不如简单地创建一个带有非素数的新列表并返回新列表,怎么样?

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

于 2015-02-19T17:39:37.017 回答
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))
于 2015-02-19T17:41:43.310 回答