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?
5 Réponses :
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)))
@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!
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
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)))
Les problèmes liés à l'itération dans un ordre alambiqué peuvent souvent être résolus élégamment avec itertools .
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))))
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'
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())
'' .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.