Подтвердить что ты не робот

"для цикла" с двумя переменными?

Как включить две переменные в один и тот же цикл for?

t1 = [a list of integers, strings and lists]
t2 = [another list of integers, strings and lists]

def f(t):  #a function that will read lists "t1" and "t2" and return all elements that are identical
    for i in range(len(t1)) and for j in range(len(t2)):
        ...
4b9b3361

Ответ 1

Если вам нужен эффект вложенного цикла, используйте:

import itertools
for i, j in itertools.product(range(x), range(y)):
    # Stuff...

Если вы хотите просто выполнить цикл одновременно, используйте:

for i, j in zip(range(x), range(y)):
    # Stuff...

Обратите внимание, что если x и y не имеют одинаковой длины, zip будет усекаться до кратчайшего. Как отметил @abarnert, если вы не хотите усекать до кратчайшего списка, вы можете использовать itertools.zip_longest.

UPDATE

На основе запроса "функция, которая будет читать списки" t1 "и" t2 "и возвращает все идентичные элементы", я не думаю, что OP хочет zip или product. Я думаю, что они хотят set:

def equal_elements(t1, t2):
    return list(set(t1).intersection(set(t2)))
    # You could also do
    # return list(set(t1) & set(t2))

Метод intersection для set вернет все общие для него элементы и другой набор (обратите внимание, что если ваши списки содержат другие list s, вам может потребоваться преобразовать внутренний list в tuples сначала, чтобы они были хешируемыми, в противном случае вызов set завершится ошибкой.). Функция list затем возвращает набор в список.

ОБНОВЛЕНИЕ 2

ИЛИ, OP может хотеть элементы, которые идентичны в одной и той же позиции в списках. В этом случае наиболее подходящим будет zip, а тот факт, что он обрезается до кратчайшего списка, - это то, что вы хотели бы (так как невозможно, чтобы один и тот же элемент был в индексе 9, когда один из списков был всего 5 элементы длинные). Если это то, что вы хотите, перейдите к следующему:

def equal_elements(t1, t2):
    return [x for x, y in zip(t1, t2) if x == y]

Это вернет список, содержащий только те элементы, которые являются одинаковыми и находятся в одной и той же позиции в списках.

Ответ 2

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

К счастью, есть простые ответы на оба вопроса. В первом случае вы хотите использовать zip.

x = [1, 2, 3]
y = [4, 5, 6]

for i, j in zip(x, y):
   print(str(i) + " / " + str(j))

выведет

1 / 4
2 / 5
3 / 6

Помните, что вы можете поместить любую итерацию в zip, чтобы вы могли так же легко написать свой пример, например:

for i, j in zip(range(x), range(y)):
    # do work here.

На самом деле, только что понял, что это не сработает. Он будет повторяться, пока не истечет меньший диапазон. В этом случае звучит так, будто вы хотите перебрать комбинацию циклов.

В другом случае вам просто нужен вложенный цикл.

for i in x:
    for j in y:
        print(str(i) + " / " + str(j))

дает вам

1 / 4
1 / 5
1 / 6
2 / 4
2 / 5
...

Вы также можете сделать это как понимание списка.

[str(i) + " / " + str(j) for i in range(x) for j in range(y)]

Надеюсь, это поможет.

Ответ 3

По какой причине вы не можете использовать вложенный цикл?

for i in range(x):
   for j in range(y):
       #code that uses i and j

Ответ 4

for (i,j) in [(i,j) for i in range(x) for j in range(y)]

должен это сделать.

Ответ 5

Если у вас действительно есть итерация блокировки в диапазоне, вы можете сделать это одним из нескольких способов:

for i in range(x):
  j = i
  …
# or
for i, j in enumerate(range(x)):
  …
# or
for i, j in ((i,i) for i in range(x)):
  …

Все вышеперечисленное эквивалентно for i, j in zip(range(x), range(y)), если x <= y.

Если вам нужен вложенный цикл, и у вас есть только два итератива, просто используйте вложенный цикл:

for i in range(x):
  for i in range(y):
    …

Если у вас более двух итераций, используйте itertools.product.

Наконец, если вам нужна итерация с блокировкой до x, а затем для продолжения y, вы должны решить, какие остальные значения x должны быть.

for i, j in itertools.zip_longest(range(x), range(y), fillvalue=float('nan')):
  …
# or
for i in range(min(x,y)):
  j = i
  …
for i in range(min(x,y), max(x,y)):
  j = float('nan')
  …

Ответ 6

"Python 3."

Добавьте 2 vars с циклом for, используя zip и range; Возврат списка.

Примечание. Будет работать только до наименьшего диапазона.

>>>a=[g+h for g,h in zip(range(10), range(10))]
>>>a
>>>[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Ответ 7

Я думаю, что вы ищете вложенные циклы.

Пример (на основе вашего редактирования):

t1=[1,2,'Hello',(1,2),999,1.23]
t2=[1,'Hello',(1,2),999]

t3=[]

for it1, e1 in enumerate(t1):
    for it2, e2 in enumerate(t2):
        if e1==e2:
            t3.append((it1,it2,e1))

# t3=[(0, 0, 1), (2, 1, 'Hello'), (3, 2, (1, 2)), (4, 3, 999)]

Который может быть сведен к единому пониманию:

[(it1,it2,e1) for it1, e1 in enumerate(t1) for it2, e2 in enumerate(t2) if e1==e2] 

Но чтобы найти общие элементы, вы можете просто сделать:

print set(t1) & set(t2)
# set([(1, 2), 1, 'Hello', 999])

Если ваш список содержит объекты, не содержащие хэшируемых объектов (например, другие списки, dicts), используйте замороженный набор:

from collections import Iterable
s1=set(frozenset(e1) if isinstance(e1,Iterable) else e1 for e1 in t1)
s2=set(frozenset(e2) if isinstance(e2,Iterable) else e2 for e2 in t2)
print s1 & s2

Ответ 8

Для вашего случая использования может быть проще использовать цикл while.

t1 = [137, 42]
t2 = ["Hello", "world"]

i = 0
j = 0
while i < len(t1) and j < len(t2):
    print t1[i], t2[j]
    i += 1
    j += 1

# 137 Hello
# 42 world

Как предостережение, этот подход будет урезан до длины вашего кратчайшего списка.