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
6 Réponses :
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]]
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.
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.
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))
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']
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.
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]
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)