2
votes

Multiplication de la liste de chaînes en Python

Question pour débutant: Si j'ai 2 listes contenant uniquement des chaînes, comment les concaténer dans une troisième liste contenant tous les éléments + chaque élément d'une liste + chaque élément de l'autre liste? J'ai pensé aux boucles for, mais n'y a-t-il pas un moyen plus simple de le faire? Exemple:

listone = ['cat', 'dog' ]
listtwo = ['bin', 'sun'] 

resulting list = ['cat', 'dog', 'bin', 'sun', 'catbin', 'catsun', 'dogbin', 'dogsun', 'catbinsun', 'catsunbin', 'catcat', 'catdog', 'dogbin', 'dogcat']

EDIT: Merci à tous pour vos réponses, mais je n'ai pas expliqué assez bien ce que je veux faire. Le nombre de chaînes dans chaque liste doit être indéfini et chaque mot doit être concaténé avec tous les autres mots, mais pas seulement sous la forme "x + y". Je veux également le concaténer avec les autres mots. Comme u = x + y + z


0 commentaires

6 Réponses :


0
votes

Sans importer itertools, vous pouvez également utiliser la concaténation de chaînes lors de l'accès aux éléments de listone et listtwo comme ceci:

result = listone + listtwo + [listone[0] + listtwo[0], listone[0] + listtwo[1], listone[1] + listtwo[0], listone[1] + listtwo[1]]


2 commentaires

Je comprends que vous ne souhaitez pas importer de bibliothèques. Mais qu'est-ce que c'est? Tu ne peux pas écrire pour la boucle?


@mamun en posant la question, il a dit qu'il avait déjà pensé à utiliser une boucle for, donc avec seulement les deux listes qu'il a fournies, c'est une alternative sans boucle. Vous pouvez également facilement transformer cela en une boucle pour plus d'éléments.



0
votes

Ou si vous voulez le faire à la main, je le ferais de cette façon:

l = ["a","b"]
l2 = ["c","d"]
l3 = l + l2
print(l3)
for x, y in zip(l,l2):
    l3.append(x+y)
print(l3)

Je ne sais pas si c'est optimal tho.


0 commentaires

2
votes

Vous pouvez utiliser le produit cartésien et joindre. Essayez ceci:

['cat', 'dog', 'bin', 'sun', 'catbin', 'catsun', 'dogbin', 'dogsun']

Résultat:

import itertools
listone = ['cat', 'dog' ]
listtwo = ['bin', 'sun'] 
listone + listtwo + list(''.join(e) for e in itertools.product(listone, listtwo))


0 commentaires

2
votes

Cela devrait faire le travail

In [33]: output = listone + listtwo + [ item_one+item_two for item_one in listone for item_two in listtwo]

In [34]: output
Out[34]: ['cat', 'dog', 'bin', 'sun', 'catbin', 'catsun', 'dogbin', 'dogsun']

Vous pouvez également le faire sans itertools

In [29]: import itertools
In [30]: listone = ['cat', 'dog' ]
    ...: listtwo = ['bin', 'sun']

In [31]: output = listone + listtwo + [ "".join(items)  for items in list(itertools.product(listone, listtwo))]

In [32]: output
Out[32]: ['cat', 'dog', 'bin', 'sun', 'catbin', 'catsun', 'dogbin', 'dogsun']


2 commentaires

Comment cela fonctionnerait-il avec plus de deux éléments? Bref exemple: je veux que ['a', 'b', 'c'] et ['c', 'd', 'e'] renvoient également [..... 'ab', 'ac' 'abc ',' abcde ',' cd ', ce, .. et cetera]


@Kodeeo publie ceci comme un autre SO et je vais y répondre. Cela nécessite des combinaisons. Merci.



0
votes

Vous pouvez obtenir ce résultat avec un code relativement simple si vous utilisez list comprehensions :

listone = ['cat', 'dog' ]
listtwo = ['bin', 'sun'] 
result_list = listone + listtwo + [x + y for x in listone for y in listtwo]


0 commentaires

0
votes

Si vous recherchez uniquement des combinaisons (c'est-à-dire x + y, x + y + z mais pas y + x ou z + y + x), vous pouvez utiliser les fonctions combinaisons d'itertools pour former un ensemble de puissances:

from itertools import combinations

words  = listone+listtwo
result = ["".join(c) for r in range(1,len(words)+1) for c in combinations(words, r)]

print(result)

# ['cat', 'dog', 'bin', 'sun', 'catdog', 'catbin', 'catsun', 'dogbin',
#  'dogsun', 'binsun', 'catdogbin', 'catdogsun', 'catbinsun', 'dogbinsun',
#  'catdogbinsun']

note: les ensembles de puissances de combinaisons croissent de façon exponentielle avec le nombre d'éléments source: 2 ^ n - 1

Si vous souhaitez obtenir des permutations à la place, remplacez combinaisons par permutations depuis itertools. (cela produira un ordre de grandeur plus d'éléments que de combinaisons)


0 commentaires