Уведомления

Группа в Telegram: @pythonsu

#1 Май 11, 2014 22:25:43

ingfa_1981
Зарегистрирован: 2014-01-25
Сообщения: 200
Репутация: +  1  -
Профиль   Адрес электронной почты  

Как разобрать список

Уважаемы форумчане, такой вопрос у меня к вам.
Как мне разложить список на три элемента?
spisok =
мне необходимы каждые три элемента из этого списка за одну итерацию.







Офлайн

#2 Май 11, 2014 23:09:50

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

Как разобрать список

def separ(mlist, step, start=0):
    for s in range(start, len(mlist), step):
        print mlist[s:s+step]    
L = range(11)
start = 0
step = 3 
separ(L, step, start)

Отредактировано vrabey (Май 11, 2014 23:30:03)

Офлайн

#3 Май 12, 2014 05:26:48

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как разобрать список

l = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
print zip(*[iter(l)] * 3)



Офлайн

#4 Май 12, 2014 06:04:03

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

Как разобрать список

продолжил пример FishHook'а

>>> import itertools
>>> 
>>> lst = list('abcdefghij')
>>> list(itertools.zip_longest(*[iter(lst)] * 3))
[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i'), ('j', None, None)]
>>>



Офлайн

#5 Май 12, 2014 07:12:38

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

Как разобрать список

глядя на примеры py.user.next и FishHook разложил так для себя

s = iter("1234567")
print map(None, s, s, s)
потому что не понимаю как работает это -
*[iter(lst)] * 3
что делает < * > перед итератором ?

Офлайн

#6 Май 12, 2014 07:16:00

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как разобрать список

vrabey
что делает < * > перед итератором
То же, что и в вызове любой функции делает звёздочка перед аргументом.



Офлайн

#7 Май 12, 2014 07:19:53

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как разобрать список

k = [None] + [s]*3
print map(*k)



Офлайн

#8 Май 12, 2014 09:31:20

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

Как разобрать список

zip(*[iter(l)] * 3)
прошу прощения за тупость.
как работает функция zip в простом примере мне понятно (вернее не “как” , а что получается на выходе)
1)
a = list('123')
b = list("abc")
print zip(a, b)

теперь я знаю что выдаст этот код:
2)
zip(*[iter(a)] * 3)
благодаря FishHook
но из первого примера я бы не смог вычислить логику второго
как это работает?
что делает функция iter()?
- Возвращает объект-итератор;
но это ничего не обоъясняет
потому что
zip(*[a] * 3)
выдаёт другой результат

Отредактировано vrabey (Май 12, 2014 09:32:57)

Офлайн

#9 Май 12, 2014 09:46:15

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как разобрать список

1. Что будет в результате?

[0] * 3
Мы получим список из трёх нулей.
2. Объект-итератор присваивается по ссылке, поэтому в результате
[iter(a)] * 3
мы получим список из трех ссылок на один и тот же итератор.
3. Если функция принимает неограниченное число параметров, то вызвать эту функцию можно так
a = [1,2,3]
b = [2,3,4]
c = [3,6,7]
rez = zip(a, b, c)
а можно и так
a = [1,2,3]
b = [2,3,4]
c = [3,6,7]
lst = [a, b , c]
rez =zip(*lst)
4. Постольку поскольку на шаге 2 мы получили список ссылок на итератор, то применив к нему звездочку в зип мы фактически сделали вот так
i = iter(l)
a = i
b = i
c = i
rez = zip(a, b, c)
А так как итератор один и тот же, то итерация a.next() изменяет курсор у a, b и c.



Офлайн

#10 Май 12, 2014 10:06:26

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

Как разобрать список

FishHook
…А так как итератор один и тот же, то итерация a.next() изменяет курсор у a, b и c.
спасибо

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version