Concaténer des listes de chaînes par élément en Python


13

Ceci est une question de pour jouer au golf en .

Supposons que vous ayez deux listes de chaînes et que vous souhaitiez concaténer les entrées correspondantes de chaque liste. Par exemple avec a=list("abcd")et b=list("1234"), calculez ["a1","b2","c3","d4"].

Ceci est trivial dans les langages de programmation basés sur des tableaux, où les opérations s'appliquent généralement par membre aux listes. Par exemple, dans ma langue de golf Pip , le code est simple a.b. Mais en Python, ce n'est pas si facile.

La façon Pythonique est probablement d'utiliser zipet une liste de compréhension (25 caractères):

[x+y for x,y in zip(a,b)]

Une autre méthode consiste mapà utiliser une fonction lambda (23):

map(lambda x,y:x+y,a,b)

Ce qui suit est le plus court que j'ai trouvé (21):

map("".join,zip(a,b))

Existe-t-il une méthode plus courte?

Supposons que les listes soient de la même longueur et qu'une sorte d'itérable soit tout ce qui est nécessaire (donc un mapobjet va bien en Python 3).


doublon possible de Conseils pour le golf en Python
Mât

@Mast La liste de conseils contient-elle une réponse qui répond à cette question spécifique?
Martin Ender

@ MartinBüttner Si ce n'est pas le cas, cela devrait. Empêche l'encombrement et garde toutes les astuces ensemble, etc.
Mât

Réponses:


14

20 caractères

map(str.__add__,a,b)

Utilise la méthode d'ajout de chaîne de la méthode intégrée __add__qui est invoquée par +on on strings à la place de votre fonction anonyme lambda x,y:x+y.


Vous savez, j'ai pensé, str.__add__mais pour une raison quelconque , je n'ai pas vérifié si c'était plus court.
DLosc

1
@DLosc le véritable avantage de cette réponse est d'utiliser mapavec plusieurs itérables, ce qui désactive automatiquement la fermeture éclair. Sans cela, ce ne serait pas plus court. Notez que si dans votre code vous devez accéder à certaines des __*__méthodes, il peut être plus court à faire from operator import *, puis à utiliser map(add,a,b).
Bakuriu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.