Ответ 1
вы можете использовать цепочку из itertools, чтобы объединить списки, а затем выполнить поиск в возвращенном списке.
>>> sample=[[1,[1,0]],[1,1]]
>>> from itertools import chain
>>> print [1,0] in chain(*sample)
True
Я прекрасно это понимаю.
sample=[[1,[1,0]],[1,1]]
[1,[1,0]] in sample
Это вернет True.
Но я хочу здесь сделать это.
sample=[[1,[1,0]],[1,1]]
[1,0] in sample
Я хочу, чтобы return был True, но это возвращает False. Я могу это сделать:
sample=[[1,[1,0]],[1,1]]
for i in range(len(sample)):
[1,0] in sample[i]
Но мне интересно, есть ли какой-нибудь лучший или эффективный способ сделать это.
вы можете использовать цепочку из itertools, чтобы объединить списки, а затем выполнить поиск в возвращенном списке.
>>> sample=[[1,[1,0]],[1,1]]
>>> from itertools import chain
>>> print [1,0] in chain(*sample)
True
Рекурсивное решение, которое будет работать для произвольной (макс. глубины рекурсии) глубокой вложенности. Также работает, если какие-либо элементы самого внешнего списка сами не являются итерами.
from functools import partial
def contains_nested(some_iterable, elmnt):
try:
if elmnt in some_iterable:
return True
except TypeError: # some_iterable is not iterable
return False
else:
return any(map(partial(contains_nested, elmnt=elmnt), some_iterable))
Я не знаю, как решить это полностью без цикла. Но в Python вы никогда не должны писать for i in range(len(sample))
.
Итак, ответ на ваш вопрос: да, есть лучший и быстрый способ, которым вы могли бы зацикливать свой список for i in sample
То, как Python обрабатывает петли, очень быстро работает и очень хорошо работает с большим количеством полномочий (более 50 000).
Вы можете свернуть свой список sample
, а затем выполнить поиск в этом сплющенном списке:
> sample = [[1, [1, 0]], [1, 1]]
> [1, 0] in [item for sublist in sample for item in sublist]
> True