Если вы хотите сгладить структуру данных, где вы не знаете, насколько глубоко она вложена, вы можете использовать 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 Отказ от ответственности: я являюсь автором этой библиотеки
Из настроек сборки проекта -> Архитектуры убедитесь, что у вас есть значения armv6
и armv7
.
Также вы можете проверить файл Info.plist в разделе Required device capabilities
. Если там есть armv7
, удалите его.
Если вы создаете эту ошибку, создайте приложение Unity 3D, замените скриптовый сервер на IL2CPP и выберите «Универсальную» архитектуру.
Это сообщение привело меня к моему ответу. Спасибо @adig и @masam
У меня есть приложение под управлением iOS 8.4, которое будет работать только на некоторых типах устройств, когда я попытаюсь установить его из нашего внутреннего магазина приложений, и это было непоследовательно. Я не получал никаких полезных сообщений об ошибках даже с консоли устройства, пока я не попытался развернуть его с помощью устройств XCode до 5-го поколения iPod. Он сказал: «Это приложение не поддерживает этот тип устройства», что привело меня сюда. Я отлаживал 6-го поколения iPod / iPhone 6.
Я архивировал с другой схемы, чем я обычно выпускаю, и я только строю существующую архитектуру, что означает, что она будет работать только на определенном типе устройства, в зависимости от того, что было подключено, когда я архивирован.
Поэтому убедитесь, что «строить только активную архитектуру» нет, когда вы архивируете приложение для подписывания в качестве корпоративного приложения.
Сегодня я столкнулся с такой проблемой на iOS 11.2.1 с устройствами iPhone 7. Причина в том, что предыдущий проект настроил 32-битную архитектуру, которая больше не поддерживается. И я решил проблему следующим образом:
Project -> Настройки сборки -> Значение архитектуры должно быть установлено Standard architectures - $(ARCHS_STANDARD)