Python 使用另一个列表作为索引,从列表中删除元素

Python 使用另一个列表作为索引,从列表中删除元素,python,loops,Python,Loops,我有一个列表primeList和另一个列表ls。primeList是一个充满整数的列表,我需要删除ls中的值,这些值的索引位于primeList中 例如,如果primelist=[1,3,5]和ls=[1,2,3,4,5,6,7],那么索引1,3和5应该从ls中删除,使ls=[1,3,5,7] 目前,我正在尝试使用以下代码: primeList = list(getPrimes()) ls = list(ls) for i in primeList: del ls

我有一个列表
primeList
和另一个列表
ls
。primeList是一个充满整数的列表,我需要删除
ls
中的值,这些值的索引位于
primeList

例如,如果
primelist=[1,3,5]
ls=[1,2,3,4,5,6,7]
,那么索引1,3和5应该从
ls
中删除,使
ls=[1,3,5,7]

目前,我正在尝试使用以下代码:

primeList = list(getPrimes())
    ls = list(ls)
    for i in primeList:
        del ls[i]
    return ls
这给了我以下错误:

Traceback (most recent call last):
File "C:/Python34/My Scripts/NLP lab2/exec2.py", line 26, in <module>
otherList = delPrimes(myList)
File "C:/Python34/My Scripts/NLP lab2/exec2.py", line 18, in delPrimes
del ls[i]
IndexError: list assignment index out of range`
作为一些作业的一部分,我们需要“用Python编写一个方法来删除列表中主要索引位置的项(最多索引位置50)。例如,它将删除索引位置2、3、5、7处的项…”我还认为我们必须使用“del”来完成删除

编辑2:

for i in reversed(primeList):
        if i <= len(ls):
            del ls[i]
        else:
            continue
return ls
反向(primeList)中的i的

如果我使用列表理解来避免更改列表:

return [v for i, v in enumerate(ls) if i not in primeList]
您正在逐个删除列表前面的元素,因此其他元素都会上移一个位置。在第一次删除后,其余索引将分别关闭1和2,以此类推:

>>> ls = [1, 2, 3, 4, 5, 6, 7]
>>> del ls[1]
>>> ls
[1, 3, 4, 5, 6, 7]
>>> ls[3]
5
>>> del ls[3]
>>> ls
[1, 3, 4, 6, 7]
>>> ls[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

但是,由于您已经在制作一份此处不需要的副本。

请使用列表理解来避免更改列表:

return [v for i, v in enumerate(ls) if i not in primeList]
您正在逐个删除列表前面的元素,因此其他元素都会上移一个位置。在第一次删除后,其余索引将分别关闭1和2,以此类推:

>>> ls = [1, 2, 3, 4, 5, 6, 7]
>>> del ls[1]
>>> ls
[1, 3, 4, 5, 6, 7]
>>> ls[3]
5
>>> del ls[3]
>>> ls
[1, 3, 4, 6, 7]
>>> ls[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

但是既然你已经在做一份拷贝了,那在这里就没有必要了。

我看到Martijn在我之前已经给出了一个完整的答案。他的回答是正确的,所以我把他的票数提高了。如果有什么不清楚的地方,就直接问。对代码的注释

您的代码粘贴不好或不正确。函数外有一个return语句。除此之外,我将试着猜测你的意图是什么,因为代码是糊状的

如果您在中使用
*
,则您正在执行一项称为解包值的操作。我不认为这是你所需要的

>>> def test(*ls):
        print ls
>>> test("a", "b", "c")
('a', 'b', 'c')
>>> ls = [1,2,3]
>>> test(ls)
([1, 2, 3],)

>>> def test(ls):
    print ls
>>> test("a", "b", "c")

Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    test("a", "b", "c")
TypeError: test() takes exactly 1 argument (3 given)
现在您可以像这样调用该函数:

>>> getPrimes(7)
[2, 3, 5, 7]
即使您的列表并不总是相同,这也会很有用,因为您可以通过询问来调用函数

>>> getPrimes(max(ls))
[2, 3, 5, 7]
其中
max(ls)
执行显而易见的操作,并返回列表中最大的元素(您拥有的最高素数)。 之后,只需按照Martijns关于如何删除元素的说明进行操作(颠倒顺序)

由于Python是动态类型化语言,所以不需要显式地将函数的返回转换为类型。因此,在
primeList=list(getPrimes())
ls=list(ls)
行中,实际上不需要
list
,除非ls从一开始就不是一个列表。您很可能有这一行,因为您的函数中有解包操作符
*
,然后返回
([1,2,3],)
,这是一个类型元组
(,)
(“一对值”),第一个元素是列表
[1,2,3]


希望我能帮你解决一些问题。快乐编程。

我看到Martijn在我之前给出了完整的答案。他的回答是正确的,所以我把他的票数提高了。如果有什么不清楚的地方,就直接问。对代码的注释

您的代码粘贴不好或不正确。函数外有一个return语句。除此之外,我将试着猜测你的意图是什么,因为代码是糊状的

如果您在中使用
*
,则您正在执行一项称为解包值的操作。我不认为这是你所需要的

>>> def test(*ls):
        print ls
>>> test("a", "b", "c")
('a', 'b', 'c')
>>> ls = [1,2,3]
>>> test(ls)
([1, 2, 3],)

>>> def test(ls):
    print ls
>>> test("a", "b", "c")

Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    test("a", "b", "c")
TypeError: test() takes exactly 1 argument (3 given)
现在您可以像这样调用该函数:

>>> getPrimes(7)
[2, 3, 5, 7]
即使您的列表并不总是相同,这也会很有用,因为您可以通过询问来调用函数

>>> getPrimes(max(ls))
[2, 3, 5, 7]
其中
max(ls)
执行显而易见的操作,并返回列表中最大的元素(您拥有的最高素数)。 之后,只需按照Martijns关于如何删除元素的说明进行操作(颠倒顺序)

由于Python是动态类型化语言,所以不需要显式地将函数的返回转换为类型。因此,在
primeList=list(getPrimes())
ls=list(ls)
行中,实际上不需要
list
,除非ls从一开始就不是一个列表。您很可能有这一行,因为您的函数中有解包操作符
*
,然后返回
([1,2,3],)
,这是一个类型元组
(,)
(“一对值”),第一个元素是列表
[1,2,3]


希望我能帮你解决一些问题。愉快的编程。

您也可以发布您的
getPrimes()
函数吗?我宁愿调试提供解决方案的函数。您也可以发布
getPrimes()
函数吗?我宁愿调试给你我的解决方案的函数。请参阅我的第二次编辑。我尝试添加这段代码,但现在没有错误,尽管如果在使用delPrimes()后打印列表,它与我在方法中输入的列表相同。使用列表理解时也是如此,你知道为什么吗?@Hjalmig:很难判断你在这里哪里出错了;最后发布的代码从
ls
中删除元素,在任何情况下都可以。添加更多的
print
语句以查看您可能会出错的地方?我在del ls[I]之后添加了print(ls),但没有任何内容被打印出来,所以似乎没有达到if语句的目的?@hjalpmig:我想没有;更多的
if
之前打印
语句,然后查看那里发生了什么。请查看我的第二次编辑。我尝试添加这段代码,但现在没有错误,尽管如果在使用delPrimes()后打印列表,它与我在方法中输入的列表相同。使用列表理解法时也是如此,你知道为什么吗?@Hjalmig:很难说你错在哪里