Non utilizzare cicli nidificati; stai accoppiando A
e B
, con B
ripetendo se necessario. Quello che vi serve è zip()
(per fare il pairing), e itertools.cycle()
(a ripetere B
):
from itertools import cycle
zip(A, cycle(B))
Se B
sta andando sempre essere la metà delle dimensioni di A
, si potrebbe anche semplicemente fare doppio B
:
zip(A, B + B)
Demo:
>>> from itertools import cycle
>>> A = [70, 60, 50, 40, 30, 20, 10, 0]
>>> B = [1, 2, 3, 4]
>>> zip(A, cycle(B))
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
>>> zip(A, B + B)
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
Nei casi in cui non si sa quale sia il più lungo lista, è possibile utilizzare min()
e max()
di scegliere quali uno per ciclo:
zip(max((A, B), key=len), cycle(min((A, B), key=len))
o per un numero arbitrario di liste fare coppia, ciclo di loro tutti ma utilizzare itertools.islice()
per limitare le cose per la lunghezza massima:
inputs = (A, B) # potentially more
max_length = max(len(elem) for elem in inputs)
zip(*(islice(cycle(elem), max_length) for elem in inputs))
Demo:
>>> from itertools import islice
>>> inputs = (A, B) # potentially more
>>> max_length = max(len(elem) for elem in inputs)
>>> zip(*(islice(cycle(elem), max_length) for elem in inputs))
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
Questo è perfetto. Grazie mille. Ho provato a utilizzare la funzione zip() ma ricevevo solo coppie fino a len (B). Non avevo idea di poter fare zip (A, B + B). –
@ A.K .: 'zip()' termina alla lunghezza più breve. Il trucco è quindi quello di rendere 'A' il più breve. –
Un altro modo per il numero arbitrario di casi, usando islice sul ** esterno ** del file zip: 'lista (islice (zip (* mappa (ciclo, input)), max (map (len, input))))' . –