удалить элементы из 3 разных списков

Мне нужна помощь в одновременном удалении некоторых элементов из некоторых списков при нажатии кнопки.

Это код:

class Window(QMainWindow):
  list_1 = []  #The items are strings
  list_2 = []  #The items are strings

  def __init__(self):
    #A lot of stuff in here

  def fillLists(self):
    #I fill the lists list_1 and list_2 with this method

  def callAnotherClass(self):
    self.AnotherClass().exec_()   #I do this to open a QDialog in a new window

class AnotherClass(QDialog):
  def __init__(self):
    QDialog.__init__(self)

    self.listWidget = QListWidget()

  def fillListWidget(self):
    #I fill self.listWidget in here

  def deleteItems(self):
    item_index = self.listWidget.currentRow()
    item_selected = self.listWidget.currentItem().text()
    for i in Window.list_2:
      if i == item_selected:
        ?????????? #Here is where i get confussed

Когда я открываю QDialog комбинацией клавиш, я вижу в QListWidget некоторые предметы. В методе deleteItems я получаю индекс и текст из элемента, который я выбрал в QListWidget. Это прекрасно работает.

Что мне нужно сделать, так это удалить элемент из list_1, list_2 и QListWidget, когда я нажимаю кнопку (которую я уже создал).

Как я могу это сделать? Надеюсь, вы можете мне помочь.


person Pablo Flores    schedule 01.02.2016    source источник


Ответы (2)


В списках Python есть объект «удалить», который выполняет это действие напрямую:

Window.list_2.remove(item_selected)  

(без необходимости вашего цикла for)

Если вам когда-нибудь понадобится выполнить более сложные операции с элементами списка, вместо этого вы можете получить индекс элемента с помощью метода index:

position = Window.list_2.index(item_selected)
Window.list_2[position] += "(selected)"

А в некоторых случаях вам может потребоваться выполнить цикл for для получения фактического индекса, а также содержимого по этому индексу списка или другой последовательности. В этом случае используйте встроенный enumerate.

Использование шаблона перечисления (если remove не существует) будет выглядеть так:

for index, content in enumerate(Window.list_2):
  if content == item_selected:
      del Window.list_2[index]
      # must break out of the for loop,
      # as the original list now has changed: 
      break
person jsbueno    schedule 01.02.2016
comment
Спасибо, шаблон enumerate сработал для того, что мне было нужно. Извините, что беспокою вас, но есть ли способ обновить QListWidget или QDialog, чтобы увидеть его без элемента, который я только что удалил. Я попробовал метод repaint, но он не работает. - person Pablo Flores; 01.02.2016
comment
Я бы посоветовал вам задать другой вопрос для этого - поскольку он связан с Qt, люди Qt могут найти лучший ответ. - person jsbueno; 01.02.2016

если у вас есть значение, просто найдите его индекс в каждом списке, а затем удалите его. Что-то типа:

 item_selected = self.listWidget.currentItem().text()
 i = Window.list_2.index(item_selected)
 if i >= 0: 
    del Window.list_2[i]

Вы также можете использовать напрямую Widow.list_x.remove(value), но это может вызвать исключение, если значение не существует.

person Derlin    schedule 01.02.2016
comment
Спасибо за ответ. Это работает для list_2 и list_1, но не для QlistWidget. QListWidgetзаполняется элементом списка_2. Итак, когда я удаляю элемент из list_2, почему он не удаляется и в listWidget? - person Pablo Flores; 01.02.2016