2017-10-30 1 views
0

Ich habe ähnlich gesehen, aber nicht das gleiche: here. Ich möchte auf jeden Fall die Permutationen, nicht Kombinationen, aller Listenelemente. Meins ist anders, weil itertools Permutation von a, b, c abc zurück gibt, aber nicht aba (soooo nah). Wie kann ich Ergebnisse wie aba zurück erhalten?ALLE Permutationen einer Liste mit Wiederholung, aber nicht verdoppelt

('a',)  <-excellent 
('b',)  <-excellent 
('c',)  <-excellent 
('a', 'b') <-excellent 
('a', 'c') <-excellent 
('b', 'a') <-excellent 
('b', 'c') <-excellent 
('c', 'a') <-excellent 
('c', 'b') <-excellent 
('a', 'b', 'c') <-- I need a,b,a 
('a', 'c', 'b') <-- I need a,c,a 
('b', 'a', 'c') <-- I need b,a,b... you get the idea 

Oh maximale Länge von Permutationen ("r" in der python.org itertools) gleich len (Liste), und ich will nicht 'Doppel' wie aab oder abb schließen ... oder abba: P Die Liste könnte beliebig lang sein.

import itertools 
from itertools import product 
my_list = ["a","b","c"] 
#print list(itertools.permutations(my_list, 1)) 
#print list(itertools.permutations(my_list, 2)) 
#print list(itertools.permutations(my_list, 3)) <-- this *ALMOST* works 

kombinierte ich die oben in eine for-Schleife

def all_combinations(varsxx): 
    repeat = 1 
    all_combinations_result = [] 
    for item in varsxx: 
     if repeat <= len(varsxx): 
      all_combinations_result.append(list(itertools.permutations(varsxx, repeat))) 
     repeat += 1 
    return all_combinations_result 

Als Referenz, wenn ich das auf dem Papier tat bekam ich 21 Ergebnisse.

Es gibt auch einen Vorteil bei der Umwandlung der Liste der Zeichenfolgen in eine Liste von Zahlen. Mein Gedanke war, dass es einfacher wäre mit Zahlen für das Permutationswerkzeug zu arbeiten. Strings könnten 10 bis 50 Zeichen lang sein.

+2

Sie müssen beschreiben, was Sie genau genauer wollen. –

Antwort

6

Obwohl Sie "definitiv die Permutationen wollen", es klingt wie Sie nicht wirklich wollen, dass Sie tatsächlich das kartesische Produkt Ihrer Sequenz mit sich von 1 bis len (Sequenz) mal wollen, mit Ergebnissen mit benachbarten gleich Elemente herausgefiltert.

Etwas wie:

In [16]: from itertools import product 

In [17]: def has_doubles(x): return any(i==j for i,j in zip(x, x[1:])) 

In [18]: seq = ["a","b","c"] 

In [19]: [x for n in range(len(seq)) for x in product(seq, repeat=n+1) 
      if not has_doubles(x)] 
Out[19]: 
[('a',), 
('b',), 
('c',), 
('a', 'b'), 
('a', 'c'), 
('b', 'a'), 
('b', 'c'), 
('c', 'a'), 
('c', 'b'), 
('a', 'b', 'a'), 
('a', 'b', 'c'), 
('a', 'c', 'a'), 
('a', 'c', 'b'), 
('b', 'a', 'b'), 
('b', 'a', 'c'), 
('b', 'c', 'a'), 
('b', 'c', 'b'), 
('c', 'a', 'b'), 
('c', 'a', 'c'), 
('c', 'b', 'a'), 
('c', 'b', 'c')] 

In [20]: len(_) 
Out[20]: 21 
+0

Das ist genial, du hast es in einem geschafft! :) Code arbeitete zum ersten Mal, die Doppel sind entfernt worden, die "Produkte" sind alle da, die Zählung ist korrekt, und es funktioniert auch auf größeren Listen :) Nailed * alles * :) Vielen Dank! – DaftVader

+0

Nochmals vielen Dank für Ihre Hilfe zu diesem Thema. Kann ich bitte nochmal um Hilfe bitten? Ich muss das Ergebnis stattdessen ERREICHEN, aber meine Versuche, dies zu ändern, erweisen sich als unfruchtbar. Ich muss über die Ergebnisse "schreiten". IE bekomme das Ergebnis ('a',) und arbeite damit. Dann gehe zu ('b',) – DaftVader

Verwandte Themen