Список проблем python

#python #list #loops

#python #Список #циклы

Вопрос:

Я пишу более широкий алгоритм, чем этот, но я думаю, что эта проблема является причиной того, что он не работает.

Вот проблемный фрагмент кода..

 difcheck = []
count = 1
questionsneeded = 4
required_dif = ["Easy", "Hard", "Medium", "Easy"]
required_topics = ["Graphs", "Math", "Geometry", "Fun"]
availablelist = [("Graphs", "Easy"), ("Fun", "aasd"), ("Geometry", "Medium"), ("Math", "Easy")]
z = 0
answerlist = []

while z < questionsneeded:
    difs = required_dif
    topics = required_topics
    for x in range(len(availablelist)):
        if availablelist[x][0] in required_topics and availablelist[x][1] in required_dif :
        difcheck.append(availablelist[x])
            try:
                required_dif.remove(availablelist[x][0])
                required_topics.remove(availablelist[x][1])
            except ValueError as exception:
                continue    
    availablelist.append(availablelist[0])          
    answerlist.append(len(difcheck))
    del availablelist[0]
    print("availablelist ")
    print(availablelist)
    print("difcheck ")
    print(difcheck) 
    z = z   1 
    del availablelist[0]
    del difcheck[:]
  

Код просматривает кортежи в availablelist и сравнивает элемент кортежа 0 с каждым элементом в required_dif и элемент кортежа 1 с каждым элементом в required_topics.

Если оба списка найдены в обоих списках, кортеж будет добавлен в difcheck.

Затем это повторяется до тех пор, пока z = questionsneeded, кортежи в доступном списке СЛЕДУЕТ каждый раз перетасовывать.

Результат, который я получаю, это

 availablelist 
[('Fun', 'aasd'), ('Geometry', 'Medium'), ('Math', 'Easy'), ('Graphs', 'Easy')]
difcheck 
[('Graphs', 'Easy'), ('Geometry', 'Medium'), ('Math', 'Easy')]
availablelist 
[('Math', 'Easy'), ('Graphs', 'Easy'), ('Geometry', 'Medium')]
difcheck 
[('Geometry', 'Medium'), ('Math', 'Easy'), ('Graphs', 'Easy')]
availablelist 
[('Geometry', 'Medium'), ('Graphs', 'Easy')]
difcheck 
[('Graphs', 'Easy'), ('Geometry', 'Medium')]
availablelist 
[('Graphs', 'Easy')]
difcheck 
[('Graphs', 'Easy')]
  

Результат, который я хочу, это

 availablelist 
[("Graphs", "Easy"), ("Fun", "aasd"), ("Geometry", "Medium"), ("Math", "Easy")]
difcheck 
[("Graphs", "Easy"), ("Fun", "aasd"), ("Geometry", "Medium"), ("Math", "Easy")]
availablelist 
[("Fun", "aasd"), ("Geometry", "Medium"), ("Math", "Easy"), ("Graphs", "Easy")]
difcheck 
[("Fun", "aasd"), ("Geometry", "Medium"), ("Math", "Easy"), ("Graphs", "Easy")]
availablelist 
 [("Geometry", "Medium"), ("Math", "Easy"), ("Graphs", "Easy"), ("Fun", "aasd")]
difcheck 
[("Geometry", "Medium"), ("Math", "Easy"), ("Graphs", "Easy"), ("Fun", "aasd")]
availablelist 
[("Math", "Easy"), ("Graphs", "Easy"), ("Fun", "aasd"), ("Geometry", "Medium")]
difcheck 
[("Math", "Easy"), ("Graphs", "Easy"), ("Fun", "aasd"), ("Geometry", "Medium")]
  

В случае, если элемент в required_topics или required_dif отсутствует в кортеже в availablelist, он не будет добавлен в difcheck. В этом случае у нас есть идеальное соответствие, поэтому все добавлено.

Проблема, вероятно, очень очевидна, но я запутался и не могу ее увидеть.

Комментарии:

1. используйте print() для отображения переменных и просмотра того, что происходит в программе (шаг за шагом), или узнайте, как использовать debuger.

2. кроме того, отступ неверен для цикла while, показанного здесь

3. у вас неправильные индексы при удалении элементов — вы пытаетесь удалить topic из required_dif списка и dif из required_topics . Используйте print() с исключением — у вас может возникнуть ошибка, и вы не будете знать, почему программа не выполняет то, что вы ожидаете.

4. Хороший момент. Теперь вижу ошибки.. Спасибо

5. Это похоже на проблему XY . Почему бы вам не описать, что вы хотите, чтобы ваша программа выполняла вместо того, чтобы пытаться заставить нас отлаживать программу, которая может даже не делать то, что вы хотите. Вероятно, есть гораздо более понятный способ сделать то, что вы хотите, чем тот, который у вас есть в настоящее время.

Ответ №1:

Эта часть выглядит в обратном направлении

 required_dif.remove(availablelist[x][0])
required_topics.remove(availablelist[x][1])
  

Я думаю, что это должно быть

 required_dif.remove(availablelist[x][1])
required_topics.remove(availablelist[x][0])
  

Кроме того, причина, по которой ваш список продолжает уменьшаться, заключается в том, что у вас есть одно добавление и два удаления в каждом цикле по списку.

  availablelist.append(availablelist[0])  # Add 1 item          
 answerlist.append(len(difcheck))
 del availablelist[0]                    # Delete 1 item
 print("availablelist ")
 print(availablelist)
 print("difcheck ")
 print(difcheck) 
 z = z   1 
 del availablelist[0]                    # Delete another item
  

Комментарии:

1. Спасибо! Ценю помощь

2. Он специально сказал, что 0 для dif и 1 для тем, почему вы думаете, что это должно быть заменено? Ну, теперь я понимаю.

3. Потому что, глядя на значения, они ссылаются на неправильные списки.