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







vrabey
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)
FishHook
l = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
print zip(*[iter(l)] * 3)
py.user.next
продолжил пример 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)]
>>>
vrabey
глядя на примеры py.user.next и FishHook разложил так для себя
s = iter("1234567")
print map(None, s, s, s)
потому что не понимаю как работает это -
*[iter(lst)] * 3
что делает < * > перед итератором ?

FishHook
vrabey
что делает < * > перед итератором
То же, что и в вызове любой функции делает звёздочка перед аргументом.
FishHook
k = [None] + [s]*3
print map(*k)
vrabey
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)
выдаёт другой результат
FishHook
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.
vrabey
FishHook
…А так как итератор один и тот же, то итерация a.next() изменяет курсор у a, b и c.
спасибо
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