使用for循环删除列表中的项目

kam*_*ame 4 python collections for-loop list

我有一个包含主题的数组,每个主题都有连接时间.我想比较列表中的每个主题.如果有两个相同的科目,我想添加两个科目的时间,并且还想删除第二个科目信息(科目名称和时间).

但是如果我删除该项目,列表会变短,我会得到一个超出范围的错误.我尝试使用subjectlegth-1缩短列表,但这也行不通.

   ...
   subjectlegth = 8
   for x in range(subjectlength):
        for y in range(subjectlength):
            if subject[x] == subject[y]:
                if x != y:
                    #add
                    time[x] = time[x] + time[y]
                    #delete
                    del time[y]
                    del subject[y]
                    subjectlength = subjectlength - 1
Run Code Online (Sandbox Code Playgroud)

Chr*_*ung 8

如果可以的话,向后迭代:

for x in range(subjectlength - 1, -1, -1):
Run Code Online (Sandbox Code Playgroud)

并且类似地y.

  • 虽然这会"解决"你在迭代它时如何删除列表元素的问题,但更大的问题是你实际上是在迭代它时修改列表.无论何时考虑这样做,请退一步看看是否可以通过构建具有所需值的新列表来解决问题.在这种情况下,你正在收集相似主题的时间值 - 想想"dict",这是一个更好的结构.如果使用Python 2.5或更高版本,请考虑"defaultdict",它比dict.get()更容易使用.Ignacio Vazquez-Abrams的答案是正确的. (4认同)

Ign*_*ams 8

如果元素是subject可以清洗的:

finalinfo = {}

for s, t in zip(subject, time):
  finalinfo[s] = finalinfo.get(s, 0) + t
Run Code Online (Sandbox Code Playgroud)

这将导致带有subject: time键值对的字典.


Ned*_*der 6

最佳做法是创建要删除的条目的新列表,并在遍历列表后删除它们:

to_del = []
subjectlength = 8
for x in range(subjectlength):
    for y in range(x):
        if subject[x] == subject[y]:
            #add
            time[x] = time[x] + time[y]
            to_del.append(y)

to_del.reverse()
for d in to_del:
    del subject[d]
    del time[d]
Run Code Online (Sandbox Code Playgroud)