Найти - Пользователи
Полная версия: Использования список списков в функции )
Начало » Python для новичков » Использования список списков в функции )
1
studdef
Можете объяснить простым языком код?
Я понял, что переменная n содержит два списка 1, 2, 3, 4, 5, 6, 7, 8, 9
Существует функция flatten с аргументом lists
Переменная result равна пустому списку что бы туда занести значение
Цикл for элемента lst в аргументе lists (непонимаю)
n = [[1, 2, 3], [4, 5, 6, 7, 8, 9]]
def flatten(lists):
result = []
for lst in lists: # ??? lists (1 2 3 4 5 6 7 8 9)
for item in lst: # ??? lst (1 2 3 4 5 6 7 8 9)
result.append(item) # ??? (добавить к result item)
return result

print flatten(n)

r00tl3ss

В функции два вложенных цикла.
В первом цикле происходит обход по списку lists, т.е. 1-й элемент будет:
[1, 2, 3]
Далее во втором цикле уже проходимся по 1-му элементу первого цикла:
1, 2, 3
вот эти значения, по-элементно, добавляются в список result.
Опять возвращаемся к первому циклу, 2-й элемент будет уже:
[4, 5, 6, 7, 8, 9]
и т.п.
Собственно возвращается нам список:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
py.user.next
Тут упростил.
Razor
Вообще код немного странноватый: раскрыть списки можно одной строкой, если это список списков, а если нет - то этот код работать не будет.

Могу порекомендовать вот это.

Flatten для списков в списке:

>>> list_of_items = [[1,2], [3], []]
>>> import itertools
>>> chain = itertools.chain(*list_of_items) #  Chain раскрывает внутренние списки
>>> print(list(chain))
[1, 3, 4]

Flatten для многоуровнего списка списков:

list_of_items = [[1, [2]], [3, [[4]]], [], [5, [6, 7]]]
def iter_flatten(root):
    if isinstance(root, (list, tuple, set)): # если root - это список, кортеж или множество
        for element in root:  # перебираем элементы из итеррируемого элемента
            for e in iter_flatten(element):  # вызываем саму себя и перебираем элементы
                yield e   # возвращаем элемент
    else:  # если root не список, не кортеж и не множество
        yield root  # возвращаем элемент

Функция вернет генератор (читайте про yield). Для преобразования в список просто поставьте list.

print list(iter_flatten(list_of_items))   # Вернет [1, 2, 3, 4, 5, 6, 7]
JOHN_16
Razor
он не странный, он учебный начального уровня.
studdef
+ да он учебный.
Только вот я не понял
В функции два вложенных цикла. <- эта понятно
В первом цикле происходит обход по списку lists, т.е. 1-й элемент будет:
[1, 2, 3]
тоже понятно

Далее во втором цикле уже проходимся по 1-му элементу первого цикла:

1, 2, 3 <——— не совсем понятно Получается два раза 1 2 3 1 2 3 ?!

вот эти значения, по-элементно, добавляются в список result.
Опять возвращаемся к первому циклу, 2-й элемент будет уже: <-не понятно



и т.п.
Собственно возвращается нам список:



Или т.е получается
for lst in lists:  #  1 2 3 здесь
     for item in lst: # ??? lst # а здесь 1 2 3 4 5 6 7 8 9
            result.append(item) # внести все значения элемента item в список result ?
Stright
Когда я только столкнулся с программированием, понять такие вещи мне помогли задачи на циклы, а еще вот этот ресурс
studdef
Stright
Когда я только столкнулся с программированием, понять такие вещи мне помогли задачи на циклы, а еще вот этот ресурс
ну эта и есть задача, просто я ее решил с подсказками и по аналогии других уроков, а код плохо понял. за ссылку спасибо хороший ресурс)

Теперь я понял по настоящему
studdef
Еще хотел воспользоваться случаем и узнать. Как изменить код, если я хочу добавить не все цифры, а к примеру какие то конкретные? (к примеру 3, 5, 7 или 1, 7)
r00tl3ss
Можно про условный оператор if почитать.
Добавить его нужно во второй цикл.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB