Python:如何在迭代列表时删除项目?

时间:2018-01-18 17:35:00

标签: python python-3.x list for-loop

我的代码如下所示:

def nue(li):
    for i in li:
        li.remove(i)
    print(li)

li = [1, 2, 3]

nue(li)

但是,运行此结果会导致:

>>> [2]

更一般地说,如何在迭代列表时删除列表中的第i个位置(原因是它在嵌套循环或某些类似的测试中失败)?

4 个答案:

答案 0 :(得分:1)

你可以这样做

function makeTabs() {

var ss = SpreadsheetApp.getActiveSpreadsheet();

var sheet = ss.getActiveSheet();

var last = sheet.getLastRow();//identifies the last active row on the sheet

//loop through the code until each row creates a tab.

for(var i=1; i<last; i++){

var tabName = sheet.getRange(i+1,9).getValue();//get the range in column I and get the value.

var create = ss.insertSheet(tabName);//create a new sheet with the value

var formulas = [

  ['=transpose('Form Responses 1'!J2:O2)'],

  ['=Arrayformula(IF(A2:A="",,VLookup(A2:A,ImportedData!A1:S,{2,11,15,18,17,19},0)))']] ;


var cell = sheet.getRange("A2:B2");

cell.setFormulas(formulas);
}
}

def nue(li): for i in li[:]: li.remove(i) print(li) li = [1, 2, 3] nue(li) 将克隆原始li

答案 1 :(得分:0)

尝试列表理解:

def remi(slist, i):    # remi means REMove I
    return [slist[j] 
            for j in range(len(slist))
            if j != i]

print(remi ([1,2,3,4], 2))

输出:

[1, 2, 4]

答案 2 :(得分:0)

为什么不使用列表推导而不是从现有列表中删除项目?

<h1>Votes#show</h1>
<h2><%= @person.name %></h2>
<%= image_tag @person.image %>

如果您不想使用列表推导,可以尝试过滤功能

old_list = [1,2,3,4,5]
li = [1,2,3]
new_list = [i for i in old_list if i not in li]

答案 3 :(得分:0)

您可能需要考虑反向遍历数组。以下代码演示了执行相同操作的三个函数。所有这些都称为prune并且可以互换。通过以相反的顺序查看数组,可以避免更改将来要检查的值的索引。

#! /usr/bin/env python3
def main():
    array = list(range(20))
    print(array)
    prune(array, lambda value: value % 3)
    print(array)


def prune(array, del_condition):
    for index, value in reversed(tuple(enumerate(array))):
        if del_condition(value):
            del array[index]


def prune(array, del_condition):
    for index in range(len(array) - 1, -1, -1):
        value = array[index]
        if del_condition(value):
            del array[index]


def prune(array, del_condition):
    for index in reversed(range(len(array))):
        if del_condition(array[index]):
            del array[index]


if __name__ == '__main__':
    main()