Jeśli chcesz efekt zagnieżdżonej pętli for, przeznaczenie:
import itertools
for i, j in itertools.product(range(x), range(y)):
# Stuff...
Jeśli chcesz tylko do pętli jednocześnie zastosowanie:
for i, j in zip(range(x), range(y)):
# Stuff...
Zauważ, że jeśli x
i y
nie są tej samej długości, zip
spowoduje obcięcie do najkrótszej listy. Jak zauważył @abarnert, jeśli nie chcesz skracać do najkrótszej listy, możesz użyć itertools.zip_longest
.
UPDATE
Na podstawie wniosku o „funkcji, która będzie czytać list«T1»i«T2»i zwrócić wszystkie elementy, które są identyczne”, nie sądzę, PO chce zip
lubproduct
. Myślę, że oni chcą set
:
def equal_elements(t1, t2):
return list(set(t1).intersection(set(t2)))
# You could also do
# return list(set(t1) & set(t2))
intersection
metoda z set
zwróci wszystkie elementy wspólne dla niego i inny zestaw (Zauważ, że jeśli list zawiera inne list
s, może chcesz przekonwertować wewnętrzna list
s do tuples
po raz pierwszy, aby były zgodne z hashable, w przeciwnym razie wywołanie set
zakończy się niepowodzeniem.). Funkcja list
przekształca następnie zestaw z powrotem na listę.
UPDATE 2
OR, PO może chcieć elementy, które są identyczne w tej samej pozycji w wykazach. W takim przypadku najodpowiedniejszy będzie zip
, a fakt, że skraca on do najkrótszej listy, jest tym, czego potrzebujesz (ponieważ niemożliwe jest, aby w indeksie 9 był taki sam element, gdy jedna z list ma tylko 5 elementów). Jeśli to, co chcesz, idź z tym:
def equal_elements(t1, t2):
return [x for x, y in zip(t1, t2) if x == y]
ta zwróci listę zawierającą tylko te elementy, które są takie same i w tej samej pozycji w listach.
Czy X i Y są dwiema listami? – CppLearner
@ user2246674 'zip' jest dobre iff iterables mają tę samą długość. – kojiro
Czy chcesz coś w rodzaju pętli zagnieżdżonej w jednym wierszu, lub po prostu do iteracji na listach jednocześnie? – SethMMorton