Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 7, 2016 21:35:23

studdef
Зарегистрирован: 2016-03-31
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Использования список списков в функции )

Можете объяснить простым языком код?
Я понял, что переменная 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)

Отредактировано studdef (Апрель 7, 2016 21:37:25)

Офлайн

#2 Апрель 8, 2016 00:26:21

r00tl3ss
Зарегистрирован: 2016-03-31
Сообщения: 25
Репутация: +  5  -
Профиль   Отправить e-mail  

Использования список списков в функции )


В функции два вложенных цикла.
В первом цикле происходит обход по списку 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]

Отредактировано r00tl3ss (Апрель 8, 2016 00:28:49)

Офлайн

#3 Апрель 8, 2016 02:48:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Использования список списков в функции )

Тут упростил.



Офлайн

#4 Апрель 8, 2016 06:06:46

Razor
Зарегистрирован: 2012-09-11
Сообщения: 127
Репутация: +  2  -
Профиль   Отправить e-mail  

Использования список списков в функции )

Вообще код немного странноватый: раскрыть списки можно одной строкой, если это список списков, а если нет - то этот код работать не будет.

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

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]

Отредактировано Razor (Апрель 8, 2016 06:13:03)

Офлайн

#5 Апрель 8, 2016 08:16:53

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Использования список списков в функции )

Razor
он не странный, он учебный начального уровня.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Апрель 8, 2016 18:44:44

studdef
Зарегистрирован: 2016-03-31
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Использования список списков в функции )

+ да он учебный.
Только вот я не понял
В функции два вложенных цикла. <- эта понятно
В первом цикле происходит обход по списку 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 ?

Отредактировано studdef (Апрель 8, 2016 18:54:15)

Офлайн

#7 Апрель 8, 2016 20:18:06

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Использования список списков в функции )

Когда я только столкнулся с программированием, понять такие вещи мне помогли задачи на циклы, а еще вот этот ресурс

Офлайн

#8 Апрель 8, 2016 21:16:19

studdef
Зарегистрирован: 2016-03-31
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Использования список списков в функции )

Stright
Когда я только столкнулся с программированием, понять такие вещи мне помогли задачи на циклы, а еще вот этот ресурс
ну эта и есть задача, просто я ее решил с подсказками и по аналогии других уроков, а код плохо понял. за ссылку спасибо хороший ресурс)

Теперь я понял по настоящему

Отредактировано studdef (Апрель 8, 2016 21:42:07)

Офлайн

#9 Апрель 8, 2016 22:31:52

studdef
Зарегистрирован: 2016-03-31
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Использования список списков в функции )

Еще хотел воспользоваться случаем и узнать. Как изменить код, если я хочу добавить не все цифры, а к примеру какие то конкретные? (к примеру 3, 5, 7 или 1, 7)

Офлайн

#10 Апрель 8, 2016 23:25:47

r00tl3ss
Зарегистрирован: 2016-03-31
Сообщения: 25
Репутация: +  5  -
Профиль   Отправить e-mail  

Использования список списков в функции )

Можно про условный оператор if почитать.
Добавить его нужно во второй цикл.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version