199-201 Радовић Огњен

## Остале занимљивости **itertools** модула

> >>> import itertools
>
>

> >>> list(itertools.product('ABC', '123')) ①
>
>

> [('A', '1'), ('A', '2'), ('A', '3'),
>
>

> ('B', '1'), ('B', '2'), ('B', '3'),
>
>

> ('C', '1'), ('C', '2'), ('C', '3')]
>
>

> >>> list(itertools.combinations('ABC', 2)) ②
>
>

> [('A', 'B'), ('A', 'C'), ('B', 'C')]
>
>

1. Функција **itertools.product()** враћа итератор који садржи картезијански производ из два низа.

2. Функција **itertools.combinations()** враћа итератор који садржи све могуће комбинације за низ задате дужине. Ово је слично функцији **itertools.permutations()**, осим што комбинације не укључују предмете који су дупликати других ставки у различитом редоследу. Тако ће **itertools.permutations('ABC', 2)** враћати и **('A', 'B')** и **('B', 'A')** (као и остале), али **itertools.combinations('ABC', 2)** неће вратити **('B', 'A')** јер је дупликат **('A', 'B')** удругачијем редоследу

> >>> names = list(open('examples/favorite-people.txt', encoding='utf-8')) ①
>
>

> >>> names
>
>

> ['Dora\n', 'Ethan\n', 'Wesley\n', 'John\n', 'Anne\n',
>
>

> 'Mike\n', 'Chris\n', 'Sarah\n', 'Alex\n', 'Lizzie\n']
>
>

> >>> names = [name.rstrip() for name in names] ②
>
>

> >>> names
>
>

> ['Dora', 'Ethan', 'Wesley', 'John', 'Anne',
>
>

> 'Mike', 'Chris', 'Sarah', 'Alex', 'Lizzie']
>
>

> >>> names = sorted(names) ③
>
>

> >>> names
>
>

> ['Alex', 'Anne', 'Chris', 'Dora', 'Ethan',
>
>

> 'John', 'Lizzie', 'Mike', 'Sarah', 'Wesley']
>
>

> >>> names = sorted(names, key=len) ④
>
>

> >>> names
>
>

> ['Alex', 'Anne', 'Dora', 'John', 'Mike',
>
>

> 'Chris', 'Ethan', 'Sarah', 'Lizzie', 'Wesley']
>
>

1. Овај идиом враћа листу линија у текстуалној датотеци.

2. Нажалост (за овај пример), идиом **list(open(filename))** такође укључује повратак на крај сваког реда. Ово схватање листе? (list comprehension) користи **rstrip()** стринг методу за уклањање празног простора из сваког реда. Стрингови такође имају метод **lstrip()** да уклоне празан простор водећих редова, и **strip()** метод за који скида обоје

3. Функција **sorted()** узима листу и враћа је сортирану. По дифолту је сортирана по абецеди.

4. Али функција **sorted()** може такође узети функцију као кључни параметар и сортирати је по том кључу. У овом случају, функција сортирања је **len()**, па је сортирана по len(each item). Прво су на реду краћа имена, а затим дужа,а затим најдужа.

Какве то везе има са **itertools** модулом? Драго ми је што си питао.

> ...наставак од последњег интерактивног shella...
>
>

> >>> import itertools
>
>

> >>> groups = itertools.groupby(names, len) ①
>
>

> >>> groups
>
>

> <itertools.groupby object at 0x00BB20C0>
>
>

> >>> list(groups)
>
>

> [(4, <itertools.\_grouper object at 0x00BA8BF0>),
>
>

> (5, <itertools.\_grouper object at 0x00BB4050>),
>
>

> (6, <itertools.\_grouper object at 0x00BB4030>)]
>
>

> >>> groups = itertools.groupby(names, len) ②
>
>

> >>> for name\_length, name\_iter in groups: ③
>
>

> ... print('Names with {0:d} letters:'.format(name\_length))
>
>

> ... for name in name\_iter:
>
>

> ... print(name)
>
>

> ...
>
>

> Names with 4 letters:
>
>

> Alex
>
>

> Anne
>
>

> Dora
>
>

> John
>
>

> Mike
>
>

> Names with 5 letters:
>
>

> Chris
>
>

> Ethan
>
>

> Sarah
>
>

> Names with 6 letters:
>
>

> Lizzie
>
>

> Wesley
>
>

**1**. Функција **itertools.groupby()** узима редослед и кључну функцију и враћа итератор који
генерише парове. Сваки пар садржи резултат key\_function(свака ставка) и још један итератор који садржи
све ставке које деле тај кључни резултат.
**2**. Позивање **list()** функције "исцрпио" итератор, тј. Већ сте генерисали сваку ставку у итератору
да би направили листу. На итератору нема дугмета за ресетовање; не можете почети испочетка
када исцрпите. Ако желите поново да прођете кроз њега (рецимо у for петљи), морате да позовете
**itertools.groupby()** поново да креира нови итератор

**КРАЈ**