Если вы хотите сгладить структуру данных, где вы не знаете, насколько глубоко она вложена, вы можете использовать iteration_utilities.deepflatten
1
>>> from iteration_utilities import deepflatten
>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> list(deepflatten(l, depth=1))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
>>> list(deepflatten(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Это генератор, поэтому вам нужно передать результат в list
или явно перебрать его.
Чтобы сгладить только один уровень, и если каждый из элементов сам итерабельен, вы также можете использовать iteration_utilities.flatten
, который сам по себе является лишь тонкой оболочкой вокруг itertools.chain.from_iterable
:
>>> from iteration_utilities import flatten
>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> list(flatten(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Просто добавьте некоторые тайминги (на основании ответа Нико Шломера, 't включить функцию, представленную в этом ответе):
Это график лог-журнала для размещения для огромного диапазона значений, охватываемых. Для качественных рассуждений: лучше нижний.
Результаты показывают, что если итерабель содержит только несколько внутренних итераций, тогда sum
будет самым быстрым, однако для длинных итераций только itertools.chain.from_iterable
, iteration_utilities.deepflatten
или вложенное понимание имеет разумную производительность, причем itertools.chain.from_iterable
является самым быстрым (как уже заметил Нико Шломер).
from itertools import chain
from functools import reduce
from collections import Iterable # or from collections.abc import Iterable
import operator
from iteration_utilities import deepflatten
def nested_list_comprehension(lsts):
return [item for sublist in lsts for item in sublist]
def itertools_chain_from_iterable(lsts):
return list(chain.from_iterable(lsts))
def pythons_sum(lsts):
return sum(lsts, [])
def reduce_add(lsts):
return reduce(lambda x, y: x + y, lsts)
def pylangs_flatten(lsts):
return list(flatten(lsts))
def flatten(items):
"""Yield items from any nested iterable; see REF."""
for x in items:
if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
yield from flatten(x)
else:
yield x
def reduce_concat(lsts):
return reduce(operator.concat, lsts)
def iteration_utilities_deepflatten(lsts):
return list(deepflatten(lsts, depth=1))
from simple_benchmark import benchmark
b = benchmark(
[nested_list_comprehension, itertools_chain_from_iterable, pythons_sum, reduce_add,
pylangs_flatten, reduce_concat, iteration_utilities_deepflatten],
arguments={2**i: [[0]*5]*(2**i) for i in range(1, 13)},
argument_name='number of inner lists'
)
b.plot()
1 Отказ от ответственности: я являюсь автором этой библиотеки
Это невозможно. На веб-сервере вы можете только контролировать, что браузер позволит вам контролировать. Проще говоря, это означает, что вы можете контролировать данные (HTML, javascript, заголовки и т. Д.), Которые вы отправляете обратно. Вот и все.
Не можете ли вы создать политику безопасности контента (CSP) и заблокировать встроенный javascript и разрешить только javascript из определенных доменов? Вы даже можете создать CSP в режиме только для отчетов и собирать отчеты о нарушениях через что-то вроде https://report-uri.io/