Все, что мне нужно сделать, это создать 1 список со всеми этими значениями без подсписок.
example = ['a', ['c', 1, 3], ['f', 7, [4, '4']], [{'lalala': 111}]]
newArray = []
def func(array):
for i in array:
for z in i:
newArray.append(z)
print(func(example))
Результатом будет: ['a', 'c', 1, 3, 'f', 7, [4, '4'], {'lalala': 111}]. Когда я добавляю 3-й объект, он говорит, что объект int не повторяется. Мне нужно как-то проверять, является ли элемент int или string, а затем пропустить их? Или я что-то упускаю?
P.S. Я считаю, что это делается с помощью рекурсивных функций, но я понятия не имею о них :(
Объект list
предлагает два разных метода для добавления новых элементов в данный list
:
list.append (x): Добавить элемент в конец списка. Эквивалентен [len (a):] = [x].
list.extend (повторяемый): Расширьте список, добавив все элементы из итерируемого. Эквивалентно [len (a):] = iterable.
old_list = ['a', ['c', 1, 3], ['f', 7, [4, '4']], [{'lalala': 111}]]
new_list = []
for element in old_list:
new_list.extend(element)
print(new_list)
Результат
['a', 'c', 1, 3, 'f', 7, [4, '4'], {'lalala': 111}]
Вот один пример рекурсивной функции, которая сглаживает ваш список:
def flatten(l):
if type(l) is list:
if not l:
return []
if len(l) == 1 :
return flatten(l[0])
else:
return flatten(l[0]) + flatten(l[1:])
else:
return [l]
Результат: ['a', 'c', 1, 3, 'f', 7, 4, '4', {'lalala': 111}]
Я не думаю, что желаемый результат будет ['a', 'c', 1, 3, 'f', 7, [4, '4'], {'lalala': 111}], потому что функция автора уже выполняет Это
Использование рекурсивной функции. Наслаждаться!
Код:
example = ['a', ['c', 1, 3], ['f', 7, [4, '4']], [{'lalala': 111}]]
newArray = []
def super_extend(v):
if type(v) is list:
[super_extend(x) for x in v if x is not None]
if type(v) is dict:
{k:super_extend(v) for k,v in v.items() if v is not None}
if type(v) is str or isinstance(v, int) or isinstance(v, float) :
newArray.append(v)
super_extend(example)
print(newArray)
Выход:
['a', 'c', 1, 3, 'f', 7, 4, '4', 111]
[Finished in 0.078s]
Если вы не хотите, чтобы словари оставались словарями, а нужны только значения. Вы можете использовать это. Но если вы хотите сохранить ключи, все, что вам нужно сделать, это использовать:
if type(v) is dict:
{super_extend(v):super_extend(k) for k,v in v.items() if v is not None}
Тогда вывод будет:
['a', 'c', 1, 3, 'f', 7, 4, '4', 'lalala', 111]
[Finished in 0.077s]
@roganjosh, это его текущий результат, когда я запускал его код. Это не тот результат, которого он желает. Он не опубликовал желаемый результат, он четко заявил, что хочет расширить его, но добавление третьего цикла выполнялось с ошибкой повторения целых чисел, что невозможно. Он также добавил возможное использование рекурсивной функции, которую я использовал.
Может быть, вы ищете что-то вроде этого:
example = ['a', ['c', 1, 3], ['f', 7, [4, '4']], [{'lalala': 111}]]
def func(array):
newArray = []
for i in array:
if ((type(i)==int) or (type(i)==str)):
newArray.append(i)
elif (type(i)==dict ):
keys = i.keys()
values = i.values()
newArray.append(keys[0])
newArray.append(values[0])
else:
for z in i:
newArray.append(z)
return newArray
print(func(example))
print(func(func(example)))
print(func(func(func(example))))
результат:
['a', 'c', 1, 3, 'f', 7, [4, '4'], {'lalala': 111}]
['a', 'c', 1, 3, 'f', 7, 4, '4', 'lalala', 111]
['a', 'c', 1, 3, 'f', 7, 4, '4', 'lalala', 111]
Использование функции рекурсивного генератора:
def flatten(l):
if isinstance(l, list):
for x in l:
yield from flatten(x)
else:
yield l
>>> list(flatten(example))
['a', 'c', 1, 3, 'f', 7, 4, '4', {'lalala': 111}]
@Taras, это должен быть принятый ответ. Намного более элегантно, чем мое решение, если вы используете python 3.3+ (хотя следует упомянуть в ответе)
посмотри на
extend