Как пройтись по двум спискам параллельно?
У меня есть два итерируемых объекта, и я хочу проходить по ним парами:
foo = [1, 2, 3]
bar = [4, 5, 6]
for (f, b) in iterate_together(foo, bar):
print("f:", f, " | b:", b)
В результате должно получиться:
f: 1 | b: 4
f: 2 | b: 5
f: 3 | b: 6
Один из способов сделать это — перебрать индексы:
for i in range(len(foo)):
print("f:", foo[i], " | b:", bar[i])
Но это кажется мне немного непитоничным. Есть ли более элегантный способ сделать это?
4 ответ(ов)
Вы хотите использовать функцию zip
. Вот пример, как это можно сделать:
for (f, b) in zip(foo, bar):
print("f:", f, "; b:", b)
В этом коде zip
объединяет элементы из списков foo
и bar
в пары, после чего вы можете итерировать по этим парам в цикле for
.
Вы можете объединить n-ые элементы в кортеж или список, используя генераторное выражение, а затем вернуть их с помощью функции-генератора.
Вот пример кода:
def iterate_multi(*lists):
for i in range(min(map(len, lists))):
yield tuple(l[i] for l in lists)
for l1, l2, l3 in iterate_multi([1, 2, 3], [4, 5, 6], [7, 8, 9]):
print(str(l1) + "," + str(l2) + "," + str(l3))
В этой реализации функция iterate_multi
принимает произвольное количество списков и генерирует кортежи, содержащие соответствующие элементы из каждого списка. Цикл for
проходит по минимальной длине среди всех переданных списков, что позволяет избежать ошибок, связанных с разной длиной списков. Полученные кортежи можно легко распаковать и использовать в других операциях.
Вы можете использовать индексы для итерации по двум спискам одновременно. Например, можно воспользоваться функцией enumerate
, которая позволяет получить индекс и элемент списка. Ниже приведен пример кода, который демонстрирует такое использование:
foo = ['a', 'b', 'c']
bar = [10, 20, 30]
for indx, itm in enumerate(foo):
print(foo[indx], bar[indx])
В этом коде мы берем каждый элемент из списка foo
и соответствующий элемент из списка bar
, используя индекс indx
, который получается через enumerate
. Результат будет следующим:
a 10
b 20
c 30
Таким образом, вы можете удобно работать с двумя списками одновременно, обращаясь к ним по одинаковому индексу.
Наиболее эффективный способ - это старый метод.
import time
abc = list(range(10000000))
xyz = list(range(10000000))
start = time.time_ns()
for i in range(0, (len(abc)-1)):
print("{} и {}".format(abc[i], xyz[i]))
print("Общее время: {}".format(time.time_ns()-start))
Время: 12315440476нс
import time
abc = list(range(10000000))
xyz = list(range(10000000))
start = time.time_ns()
for a, b in zip(abc, xyz):
print("{} и {}".format(a, b))
print("Общее время: {}".format(time.time_ns()-start))
Время: 12338617143нс
В данном случае, хотя второй способ выглядит более элегантно и читабельно с использованием zip
, первый способ оказывается быстрее по времени выполнения. Важно учитывать, что производительность может меняться в зависимости от контекста и размера данных, поэтому стоит тестировать оба метода в вашем конкретном случае.
Почему используется string.join(list), а не list.join(string)?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Как вернуть ключи словаря в виде списка в Python?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Как преобразовать строковое представление списка в список?