4
votes

Obtenir le caractère de plusieurs chaînes en séquence

Comment puis-je prendre le premier caractère de chaque chaîne dans une liste, les joindre, puis le deuxième caractère de chaque chaîne, les joindre, et ainsi de suite - et finalement créer une chaîne combinée?

par exemple. si j'ai des chaînes comme celles-ci:

final_c = ['homanif', 'eiesdnt', 'ltiwege', 'lsworar']

final_message = ""
current_char = 0

for i in range(len(final_c[1])):
    for c in final_c:
        final_message += c[current_char]
    current_char += 1

final_message += final_c[0][:-1]    

print(final_message)    

Je veux que le résultat final soit helloitsmeiwaswonderingafter

J'ai mis en place un très hackney version de celui-ci qui fait le travail mais produit une ligne supplémentaire de charabia. Étant donné que cet index est susceptible de sortir de la plage, je ne pense pas que ce soit une bonne approche:

homanif
eiesdnt
ltiwege
lsworar

me donne helloitsmeiwaswonderingafterhomani quand il le devrait arrêtez-vous simplement à helloitsmeiwaswonderingafter.

Comment puis-je améliorer cela?


2 commentaires

'' .join (''. join (t) pour t dans (zip (* final_c)))


@Chris_Rands votre solution a très bien fonctionné! J'aurais aimé pouvoir le marquer comme la réponse.


5 Réponses :


2
votes

Vous pouvez utiliser une compréhension imbriquée:

y = "".join("".join(y) for y in zip(*x))     

ou utiliser des jointures imbriquées et zip

x = ["homanif", 
     "eiesdnt", 
     "ltiwege", 
     "lsworar"] 

y = "".join(x[i][j]
            for j in range(len(x[0]))
            for i in range(len(x)))


1 commentaires

@Chris_Rands m'a déjà donné le deuxième code one-liner dans la section commentaires à la place, qui a très bien fonctionné. Néanmoins, je marquerai ceci comme la bonne réponse car il a cela. Merci!



1
votes

Voici un code qui fonctionne pour moi:

final_c = ["homanif", "eiesdnt", "ltiwege", "lsworar"]
final_message = ""
current_char = 0

for i in range(len(final_c[1])):
    for c in final_c:
        final_message += c[current_char]
    current_char += 1

# final_message += final_c[0][:-1]    

print(final_message) 

J'espère que cela aide


0 commentaires

1
votes

Je ne comprends pas ce que vous attendez de la ligne final_message + = final_c [0] [: - 1]

Le code fonctionne très bien sans cela. Supprimez cette ligne ou utilisez quelque chose comme les compréhensions de liste:

helloitsmeiwaswonderingafter

Ceci donne le résultat attendu:

final_message = "".join(final_c[i][j] for j in range(len(final_c[0])) for i in range(len(final_c)))


0 commentaires

3
votes

Les problèmes liés à l'itération dans un ordre alambiqué peuvent souvent être résolus élégamment avec itertools .

Utilisation de zip

Vous pouvez utiliser zip et itertools.chain ensemble.

from itertools import cycle

final_c = ['homanif', 'eiesdnt', 'ltiwege', 'lsworara']
final_message = ''.join(next(w) for w in cycle(iter(w) for w in final_c))

Dans le cas où vous auriez besoin que les chaînes de final_c soient de longueurs différentes, vous pouvez modifier un peu votre code en utilisant itertools.zip_longest code>.

final_message = ''.join(filter(None, chain.from_iterable(zip_longest(*final_c))))

Utilisation du cycle

La partie amusante avec itertools est qu'il offre de nombreuses solutions courtes et intelligentes pour l'itération sur les objets. En voici un autre utilisant itertools.cycle .

from itertools import chain

final_c = ['homanif', 'eiesdnt', 'ltiwege', 'lsworar']
final_message = ''.join(chain.from_iterable(zip(*final_c))) # 'helloitsmeiwaswonderingafter'


0 commentaires

0
votes

On dirait que vous pouvez avoir une matrice de forme nxm où n est le nombre de mots et m est le nombre de caractères dans un mot (le code suivant fonctionnera si tous vos mots ont la même longueur)

import numpy as np

n = len(final_c)  # number of words in your list
m = len(final_c[0])  # number of character in a word

array = np_array(''.join([list(w) for w in ''.join(final_c)])
# reshape the array 
matrix = array.reshape(n,1,m )
''.join(matrix.transpose().flatten())


0 commentaires