HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Иногда нам нужно пройти по нескольким спискам в одном цикле и взять из них данные с одинаковых позиций. Допустим, у нас есть два списка:</p>
1 <p>Иногда нам нужно пройти по нескольким спискам в одном цикле и взять из них данные с одинаковых позиций. Допустим, у нас есть два списка:</p>
2 name_hero = [ 'Hulk', 'Mr. Fantastic', 'Invisible Woman', 'Doctor Strange', 'Doctor Octopus', 'Spider-Man', ] name_real = [ 'Bruce Banner', 'Reed Richards', 'Sue Storm', 'Stephen Strange', 'Otto Octavius', 'Peter Parker', ]<p>И перед нами стоит задача обработать пары. К сожалению, в коде новичков часто можно встретить такие подходы:</p>
2 name_hero = [ 'Hulk', 'Mr. Fantastic', 'Invisible Woman', 'Doctor Strange', 'Doctor Octopus', 'Spider-Man', ] name_real = [ 'Bruce Banner', 'Reed Richards', 'Sue Storm', 'Stephen Strange', 'Otto Octavius', 'Peter Parker', ]<p>И перед нами стоит задача обработать пары. К сожалению, в коде новичков часто можно встретить такие подходы:</p>
3 # Так делать плохо for i in range(len(name_hero)): print(name_hero[i], '-', name_real[i]) # И так делать тоже плохо for i, nickname in enumerate(name_hero): print(nickname, '-', name_real[i])<p>Такой подход не укладывается в<strong>python-way</strong>. Поэтому есть встроенный инструмент, чтобы сделать это лучше:</p>
3 # Так делать плохо for i in range(len(name_hero)): print(name_hero[i], '-', name_real[i]) # И так делать тоже плохо for i, nickname in enumerate(name_hero): print(nickname, '-', name_real[i])<p>Такой подход не укладывается в<strong>python-way</strong>. Поэтому есть встроенный инструмент, чтобы сделать это лучше:</p>
4 for nickname, name in zip(name_hero, name_real): print(nickname, '-', name) # Все три цикла выведут одинаковый результат: Hulk - Bruce Banner Mr. Fantastic - Reed Richards Invisible Woman - Sue Storm Doctor Strange - Stephen Strange Doctor Octopus - Otto Octavius Spider-Man - Peter Parker<p>Давайте рассмотрим подробней,<strong>что мы получаем, когда используем</strong>zip. Так как оттуда возвращается генератор, приведём результат к списку:</p>
4 for nickname, name in zip(name_hero, name_real): print(nickname, '-', name) # Все три цикла выведут одинаковый результат: Hulk - Bruce Banner Mr. Fantastic - Reed Richards Invisible Woman - Sue Storm Doctor Strange - Stephen Strange Doctor Octopus - Otto Octavius Spider-Man - Peter Parker<p>Давайте рассмотрим подробней,<strong>что мы получаем, когда используем</strong>zip. Так как оттуда возвращается генератор, приведём результат к списку:</p>
5 names_paired = list(zip(name_hero, name_real)) print(names_paired) # Результат: [('Hulk', 'Bruce Banner'), ('Mr. Fantastic', 'Reed Richards'), ('Invisible Woman', 'Sue Storm'), ('Doctor Strange', 'Stephen Strange'), ('Doctor Octopus', 'Otto Octavius'), ('Spider-Man', 'Peter Parker')]<p>Видим, что мы получили список из тюплов (кортежей), каждый из которых - пара из элементов обоих списков: первый с первым, третий с третьим и т. д., а в цикле мы распаковываем каждую пару в переменные nickname и name.</p>
5 names_paired = list(zip(name_hero, name_real)) print(names_paired) # Результат: [('Hulk', 'Bruce Banner'), ('Mr. Fantastic', 'Reed Richards'), ('Invisible Woman', 'Sue Storm'), ('Doctor Strange', 'Stephen Strange'), ('Doctor Octopus', 'Otto Octavius'), ('Spider-Man', 'Peter Parker')]<p>Видим, что мы получили список из тюплов (кортежей), каждый из которых - пара из элементов обоих списков: первый с первым, третий с третьим и т. д., а в цикле мы распаковываем каждую пару в переменные nickname и name.</p>
6 <p>Однако помимо создания пар zip, поможет также обратно разделить пары на отдельные списки. Для этого передадим туда все пары (распакуем при помощи *):</p>
6 <p>Однако помимо создания пар zip, поможет также обратно разделить пары на отдельные списки. Для этого передадим туда все пары (распакуем при помощи *):</p>
7 names_unpaired = list(zip(*names_paired)) print(names_unpaired) # Получаем список из двух тюплов: [('Hulk', 'Mr. Fantastic', 'Invisible Woman', 'Doctor Strange', 'Doctor Octopus', 'Spider-Man'), ('Bruce Banner', 'Reed Richards', 'Sue Storm', 'Stephen Strange', 'Otto Octavius', 'Peter Parker')] # Распаковываем два тюпла new_name_hero, new_name_real = names_unpaired # И проверяем, что результаты равны исходным данным print('name_hero == new_name_hero:', tuple(name_hero) == new_name_hero) print('name_real == new_name_real:', tuple(name_real) == new_name_real) # В консоли получаем: name_hero == new_name_hero: True name_real == new_name_real: True<p>Это работает<strong>не только с парами</strong>, можно использовать необходимое количество аргументов:</p>
7 names_unpaired = list(zip(*names_paired)) print(names_unpaired) # Получаем список из двух тюплов: [('Hulk', 'Mr. Fantastic', 'Invisible Woman', 'Doctor Strange', 'Doctor Octopus', 'Spider-Man'), ('Bruce Banner', 'Reed Richards', 'Sue Storm', 'Stephen Strange', 'Otto Octavius', 'Peter Parker')] # Распаковываем два тюпла new_name_hero, new_name_real = names_unpaired # И проверяем, что результаты равны исходным данным print('name_hero == new_name_hero:', tuple(name_hero) == new_name_hero) print('name_real == new_name_real:', tuple(name_real) == new_name_real) # В консоли получаем: name_hero == new_name_hero: True name_real == new_name_real: True<p>Это работает<strong>не только с парами</strong>, можно использовать необходимое количество аргументов:</p>
8 first_appeared = [ 'The Incredible Hulk (May 1962)', 'The Fantastic Four #1 (Nov. 1961)', 'The Fantastic Four #1 (Nov. 1961)', 'Strange Tales #110 (July 1963)', 'The Amazing Spider-Man #3 (July 1963)', 'Amazing Fantasy #15 (August 1962)', ] for nickname, name, appeared in zip(name_hero, name_real, first_appeared): print(f'{nickname} [{name}]: {appeared}')<h2>Получаем:</h2>
8 first_appeared = [ 'The Incredible Hulk (May 1962)', 'The Fantastic Four #1 (Nov. 1961)', 'The Fantastic Four #1 (Nov. 1961)', 'Strange Tales #110 (July 1963)', 'The Amazing Spider-Man #3 (July 1963)', 'Amazing Fantasy #15 (August 1962)', ] for nickname, name, appeared in zip(name_hero, name_real, first_appeared): print(f'{nickname} [{name}]: {appeared}')<h2>Получаем:</h2>
9 Hulk [Bruce Banner]: The Incredible Hulk (May 1962) Mr. Fantastic [Reed Richards]: The Fantastic Four №1 (Nov. 1961) Invisible Woman [Sue Storm]: The Fantastic Four №1 (Nov. 1961) Doctor Strange [Stephen Strange]: Strange Tales №110 (July 1963) Doctor Octopus [Otto Octavius]: The Amazing Spider-Man №3 (July 1963) Spider-Man [Peter Parker]: Amazing Fantasy №15 (August 1962)
9 Hulk [Bruce Banner]: The Incredible Hulk (May 1962) Mr. Fantastic [Reed Richards]: The Fantastic Four №1 (Nov. 1961) Invisible Woman [Sue Storm]: The Fantastic Four №1 (Nov. 1961) Doctor Strange [Stephen Strange]: Strange Tales №110 (July 1963) Doctor Octopus [Otto Octavius]: The Amazing Spider-Man №3 (July 1963) Spider-Man [Peter Parker]: Amazing Fantasy №15 (August 1962)