3 votes

Fusionner deux listes alternativement n éléments

J'ai deux listes de même longueur :

list_1 = [1,2,3,4,5,6]
list_2 = ['a','b','c','d','e','f']

Je dois fusionner ces listes en fonction de n comme ci-dessous :

  • si n = 1 : result = [1,'a',2,'b',3,'c',4,'d',5,'e',6,'f']
  • si n = 2 : result = [1,2,'a','b',3,4,'c','d',5,6,'e','f']
  • si n = 3 : result = [1,2,3,'a','b','c',4,5,6,'d','e','f']
  • si n = 4 : result = [1,2,3,4,'a','b','c','d',5,6,'e','f'] et ainsi de suite

Existe-t-il un moyen pythique d'y parvenir ? Jusqu'à présent, je ne sais que faire si n = 1 avec la compréhension de liste :

result = [x for sublist in zip(list_1, list_2) for x in sublist]

Je ne sais pas comment le faire dynamiquement.

0 votes

0 votes

@Zhubei-Federer merci de partager mais cela ne semble pas être la réponse que je cherche.

4voto

jizhihaoSAMA Points 10614

Essayez itertools( zip_longest y chain.from_iterable ) avec une liste de compréhension, en une seule phrase :

import itertools

def merge(l1, l2, n):
    return [j for i in zip(itertools.zip_longest(*[iter(l1)]*n), itertools.zip_longest(*[iter(l2)]*n)) for j in itertools.chain.from_iterable(i) if j]

list_1 = [1, 2, 3, 4, 5, 6]

list_2 = ["a", "b", "c", "d", "e", "f"]

print(merge(list_1, list_2, 2))
# [1, 2, 'a', 'b', 3, 4, 'c', 'd', 5, 6, 'e', 'f']
print(merge(list_1, list_2, 3))
# [1, 2, 3, 'a', 'b', 'c', 4, 5, 6, 'd', 'e', 'f']
print(merge(list_1, list_2, 4))
# [1, 2, 3, 4, 'a', 'b', 'c', 'd', 5, 6, 'e', 'f']

Quelques références possibles : Comment fonctionne zip(*[iter(s)]*n) en Python ?

0voto

Arwalk Points 188

Réponse alternative utilisant des générateurs :

list_1 = [1,2,3,4,5,6]
list_2 = ['a','b','c','d','e','f']

def merge(a, b, n):
    a_index = 0
    b_index = 0
    while(a_index < len(a)):
        for _ in range(n):
            yield a[a_index]
            a_index +=1
        for _ in range(n):
            yield b[b_index]
            b_index += 1

result = [x for x in merge(list_1, list_2, 1)]
assert result == [1, 'a', 2, 'b', 3, 'c', 4, 'd', 5, 'e', 6, 'f']

result = [x for x in merge(list_1, list_2, 2)]
assert result == [1, 2, 'a', 'b', 3, 4, 'c', 'd', 5, 6, 'e', 'f']

result = [x for x in merge(list_1, list_2, 3)]
assert result == [1,2,3,'a','b','c',4,5,6,'d','e','f']

Ne fonctionne que pour les listes de même taille et comporte probablement plus de pièges.

Edit : juste pour le fun, voici une version sans gestion d'un index.

def merge(a, b, n):
    gen_a = (x for x in a)
    gen_b = (x for x in b)
    try:
        while True:
            for _ in range(n):
                yield next(gen_a)
            for _ in range(n):
                yield next(gen_b)
    except StopIteration:
        pass

-1voto

bays2023 Points 5
def main(order, iArr, sArr):
    arr = []
    for type in order:
        if type == 'i':
            arr.append(iArr[0])
            iArr.remove(iArr[0])
        else:
            arr.append(sArr[0])
            sArr.remove(sArr[0])
    return arr
order1 = ['i', 's', 'i', 's', 'i', 's', 'i', 's', 'i', 's', 'i', 's']
order2 = ['i', 'i', 's', 's', 'i', 'i', 's', 's', 'i', 'i', 's', 's']
order3 = ['i', 'i', 'i', 's', 's', 's', 'i', 'i', 'i', 's', 's', 's']
list_1 = [1,2,3,4,5,6]
list_2 = ['a', 'b', 'c', 'd', 'e', 'f']
print(main(order2, list_1, list_2))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X