Вот решение, использующее понимание списка, которое часто является полезным подходом, когда вы хотите сделать вещи как можно более Pythonic
def is_sublist( seq, lists ):
for candidate in lists:
if len( candidate ) > len( seq ) and candidate[ :len( seq ) ] == seq:
return True
return False
moves = [[3, 0, 5, 2, 3, 4], [5, 0, 3, 2, 5, 4], [1, 0, 2, 1], [1, 2, 2, 3], [1, 2, 2, 1], [1, 4, 2, 3], [2, 5, 3, 6], [2, 5, 3, 4], [2, 7, 3, 6], [3, 0, 5, 2], [5, 0, 3, 2]]
# here comes the list comprehension:
pruned = [ eachMove for eachMove in moves if not is_sublist( eachMove, moves ) ]
Чтобы изменить последовательность moves
на месте, вы должны назначитьна moves[:]
вместо новой переменной pruned
.
Однако приведенное выше решение не является наиболее эффективным, что может быть проблемой, если число потенциальных ходов велико.Подход менее элегантно выглядящий, как, например, следующий, может быть целесообразным, потому что, поскольку ходы кандидатов отклоняются, мы уменьшаем количество потенциальных суперсписков, по которым должен проверяться каждый будущий потенциальный подсписок:
accepted = []
while moves:
eachMove = moves.pop( 0 )
if not is_sublist( eachMove, moves ) and not is_sublist( eachMove, accepted ):
accepted.append( eachMove )
moves[:] = accepted
Если упорядочениеиз списка ходов не важно, выполнение moves.sort()
в верхней части этой подпрограммы сделает ее более эффективной (на самом деле, тогда мы могли бы оптимизировать код еще дальше, потому что каждое движение только когда-либо должно сравниваться с следующий переместиться в списке).