12

Как пройтись по двум спискам параллельно?

11

У меня есть два итерируемых объекта, и я хочу проходить по ним парами:

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 ответ(ов)

1

Вы хотите использовать функцию zip. Вот пример, как это можно сделать:

for (f, b) in zip(foo, bar):
    print("f:", f, "; b:", b)

В этом коде zip объединяет элементы из списков foo и bar в пары, после чего вы можете итерировать по этим парам в цикле for.

0

Вы можете объединить 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 проходит по минимальной длине среди всех переданных списков, что позволяет избежать ошибок, связанных с разной длиной списков. Полученные кортежи можно легко распаковать и использовать в других операциях.

0

Вы можете использовать индексы для итерации по двум спискам одновременно. Например, можно воспользоваться функцией 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

Таким образом, вы можете удобно работать с двумя списками одновременно, обращаясь к ним по одинаковому индексу.

0

Наиболее эффективный способ - это старый метод.

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, первый способ оказывается быстрее по времени выполнения. Важно учитывать, что производительность может меняться в зависимости от контекста и размера данных, поэтому стоит тестировать оба метода в вашем конкретном случае.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь