Удалить элемент в списке, используя цикл for - PullRequest
4 голосов
/ 13 января 2010

У меня есть массив с предметами, и у каждого предмета есть связанное время. Я хочу сравнить все предметы в списке. Если есть два одинаковых предмета, я хочу добавить время обоих предметов, а также удалить информацию второго предмета (имя субъекта и время).

Но если я удаляю элемент, список становится короче, и я получаю ошибку вне диапазона. Я пытался сделать список короче с использованием 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

Ответы [ 5 ]

8 голосов
/ 13 января 2010

Если элементы subject являются хэшируемыми:

finalinfo = {}

for s, t in zip(subject, time):
  finalinfo[s] = finalinfo.get(s, 0) + t

Это приведет к диктовке с subject: time парами ключ-значение.

8 голосов
/ 13 января 2010

Итерация в обратном направлении, если вы можете:

for x in range(subjectlength - 1, -1, -1):

и аналогично для y.

6 голосов
/ 13 января 2010

Рекомендуется создать новый список удаляемых записей и удалить их после просмотра списка:

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]
2 голосов
/ 13 января 2010

Альтернативным способом было бы создание списков объектов и времени заново, используя диктовку для суммирования времен повторяющихся объектов (я предполагаю, что объекты являются строками, т.е. хэшируемыми).

subjects=['math','english','necromancy','philosophy','english','latin','physics','latin']
time=[1,2,3,4,5,6,7,8]
tuples=zip(subjects,time)
my_dict={}
for subject,t in tuples:
    try:
        my_dict[subject]+=t
    except KeyError:
        my_dict[subject]=t
subjects,time=my_dict.keys(), my_dict.values()
print subjects,time
0 голосов
/ 14 марта 2017

Хотя цикл while, безусловно, является лучшим выбором для этого, если вы настаиваете на использовании цикла for, можно заменить list подлежащие удалению элементы на None или любой другой различимый элемент. и переопределите list после цикла for. Следующий код удаляет четные элементы из списка целых чисел:

nums = [1, 1, 5, 2, 10, 4, 4, 9, 3, 9]
for i in range(len(nums)):
  # select the item that satisfies the condition
  if nums[i] % 2 == 0:
    # do_something_with_the(item)
    nums[i] = None  # Not needed anymore, so set it to None
# redefine the list and exclude the None items
nums = [item for item in nums if item is not None]
# num = [1, 1, 5, 9, 3, 9]

В случае вопроса в этом посте:

...
for i in range(subjectlength - 1):
  for j in range(i+1, subjectlength):
    if subject[i] == subject[j]:
      #add
      time[i] += time[j]
        # set to None instead of delete
        time[j] = None
        subject[j] = None
time = [item for item in time if item is not None]
subject = [item for item in subject if item is not None]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...