0
votes

Dupliquer les éléments dans une liste avec des combinaisons

avec deux listes en Python:

i = [0, 1, 2, 3, 4]
j = [1, 4]

all_lists = [i]
for x in j:
    new_list = i.copy()
    new_list.insert(i.index(x), x)
    all_lists.append(new_list)

print(all_lists)
# [[0, 1, 2, 3, 4], [0, 1, 1, 2, 3, 4], [0, 1, 2, 3, 4, 4]]
# still missing the [0, 1, 1, 2, 3, 4, 4] case


6 commentaires

Est i garanti être trié? Et j ? Les deux ne contiendront toujours aucun doublon? Par exemple, savons-nous que nous ne pouvons jamais avoir i = [1, 2, 2,3] ?


i ne contiendra jamais de duplicats, mais il n'y a pas de tri, j'ai utilisé des entiers pour l'exemple, je pourrais aussi être ["D", "B", "A" > et j ["b"]


Pouvez-vous expliquer pourquoi votre exemple a toujours i entièrement contenu mais pas j ?


@Dawg - C'est l'une des combinaisons requises. Il serait bien d'ajouter simplement i à la sortie au début ou à la fin comme une opération distincte.


@geographika vient de commencer par all_lists = [i, liste (triée (i + j))] alors vous pouvez faire pour élément dans j: all_lists.append (Liste (triée (I + [ article])))) ? (Oui. Ajoutez également le cas i + j manuellement, puis effectuez la combinaison avec les éléments de la liste j )


Sur votre 2e exemple, vous avez dupliqué c, d deux fois


3 Réponses :


3
votes

Vous avez raison d'essayer d'utiliser iTertools . La fonction combinaisons est ce que vous voulez. Il suffit de boucler sur toutes les longueurs possibles (de 0 à len (j)): xxx

Vous avez dit que les listes peuvent contenir des éléments de n'importe quel type. Voici un exemple de faire la même chose à l'aide d'un nœud de classe personnalisé : xxx

la différence de clé avec l'utilisation de classes est que deux classes de nœuds instanciées avec Le même nom n'est pas le même objet, donc i.index (x) dans votre clé de tri ne fonctionnera pas, car aucun élément de j sont dans i (même s'ils ont le même nom et sont "égaux"). Je peux expliquer cela plus si vous le souhaitez.


8 commentaires

plage (len (j) + 1) est en réalité le bon choix car la combinaison zéro donnera la liste d'origine manquante


Au fait, j'ai eu l'impression j était une liste d'index et non de valeurs


Merci @jbernardo. Je ne pense pas que J est des index, mais peut-être que je me trompe.


@Peacefuljames - Merci pour cela - une bonne réponse. Toutes mes excuses pour modifier apparemment les critères et ne plus être plus clairs dans la question initiale - L'ordre de I est important car les valeurs pouvaient être n'importe quel type de données empêchant d'utiliser trié . J'ai mis à jour la question.


Ça devrait être facile, il suffit de passer une "fonction clé" à trié basé sur i ou a ou autre que vous appelez la super-liste . Je vais mettre à jour ma réponse.


Avez-vous vu des «fonctions de Lambda» avant? Est-ce que ça a du sens ce que je fais?


@Peacefuljames - excellent fonctionne parfaitement merci. Oui Re The Lambda - Il est utilisé pour trier les sorties à l'aide de l'ordre d'index de la liste d'origine, très agréable,


Vous avez dit que les listes peuvent être de n'importe quel type, je vais donc fournir un autre exemple en utilisant un type personnalisé. Si cela répond à votre question, veuillez l'accepter.



1
votes

modifié pour refléter que j est une liste des valeurs à dupliquer xxx

éditer en utilisant insérer est plus efficace que ce que j'avais avant


3 commentaires

@Jbernando - désolé de ne pas avoir plus clairement plus clair que le J était un sous-ensemble des valeurs de i. J'ai ajouté un exemple de chaîne.


@geographika ok donc je l'ai réparé pour récupérer les index des valeurs à la place


Fonctionne parfaitement (et aidé à corriger ma sortie manuelle!)



0
votes

Est-ce ce que vous recherchez? XXX


0 commentaires