Почему это не дает мне пустой набор? - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть следующий код:

a=[[2,3],[3,2]]
new=[i for i in a if i.reverse not in a]
print(new)

Это дает мне:

[[2,3],[3,2]]

Но это должно дать мне пустой набор, так как обратное значение [2,3] равно [3,2], который является элементом множества а.

Что я должен исправить?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

В вашем коде есть две ошибки.

Сначала вы не вызываете метод list.reverse, а просто проверяете, находится ли он в list.

if i.reverse not in a

Второй, list.reverse переворачивает list, он не возвращает новый.

>>> l = [1, 2, 3]
>>> output = l.reverse()
>>> print(output)
None
>>> l
[3, 2, 1]

Это означает, что даже вызов метода будет неправильным, поскольку он вернет неправильный результат и мутируйте ваш список a.

Решение

Обратите внимание, что использование in против list требует обхода всего списка.Таким образом, для больших наборов данных лучше использовать set для поиска в постоянном времени.

a = [[2, 3], [3, 2]]
set_for_lookup = set(map(tuple, a))

new = [i for i in a if tuple(i) not in set_for_lookup]

print(new) # []

Затраты на сборку set сделают это немного медленнее для небольших списков, но будутзначительно улучшить свой алгоритм для больших данных, переходя от O (n 2 ) к O (n) .

0 голосов
/ 22 сентября 2018

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

>> a = [[2, 3], [3, 2]]
>> new = [i for i in a if reversed(i) not in a]
>> print(new)
[[2, 3], [3, 2]]

Это не работает!Это связано с тем, что reversed() будет возвращать объект итератора, и это значение оценивается как False, если проверено на a:

>> reversed([2, 3])
<list_reverseiterator at 0x1c1d9cd550>

>> reversed([2, 3]) in a
False

Следовательно, вам нужно использовать list() для оценкиитератор:

>> a = [[2, 3], [3, 2]]
>> new = [i for i in a if list(reversed(i)) not in a]
>> print(new)
[]
...