2016-10-22 8 views
-1

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

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

Он повторяет это до тех пор, пока 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, это не было бы добавлен в diffcheck. В этом случае у нас есть идеальное соответствие, поэтому все добавлено.

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

+0

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

+2

также, отступ недействителен для цикла while, показанного здесь – Sundeep

+1

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

ответ

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]) 

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

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 
+0

Спасибо! Цените помощь – Docskii

+0

Он специально сказал, что 0 для разных и 1 для тем, почему вы думаете, что его нужно поменять местами? Я вижу, сейчас. – kabanus

+0

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

Смежные вопросы