2017-12-09 21 views
0

Ich habe eine Liste, die wie folgt aussieht:alle möglichen Kombinationen für 3 Ziffern der Liste nie die gleiche

A 
B 
C 
D 
E 
F 
G 

Wie löse ich diese alle Kombinationen für 3 Stellen zu finden. Derselbe Buchstabe kann nicht in derselben Zeile verwendet werden.

ABC 
ABD 
ABE 
ABF 
ABG 
AGB 

Z. B so etwas wie ...:

x = ['a','b','c','d','e'] 
n = 3 
import itertools 
aa = [list(comb) for i in range(1, n+2) for comb in itertools.combinations(x, i)] 
print(aa) 

Diese geben nicht gewünschten Eingang:

[['a'], ['b'], ['c'], ['d'], ['e'], ['a', 'b'], ['a', 'c'], ['a', 'd'], ['a', 'e'], ['b', 'c'], ['b', 'd'], ['b', 'e'], ['c' 
+0

Ich glaube, Sie nah sind. Ich bin nicht 100% sicher, dass ich verstehe, was Ihre gewünschte Ausgabe ist. Ich habe '' 'aa = [Liste (Kamm) für i in Bereich (3, 4) für Kamm in itertools.combinations (x, i)]' '', um '' '[['a', 'b' zu erhalten , a, b, d, a, b, e, a, c, d, a ',' c ',' e '], [' a ',' d ',' e '], [' b ',' c ',' d '],' 'b', 'c', ' e '], [' b ',' d ',' e '], [' c ',' d ',' e ']] '' ' – Martin

Antwort

1

Die Python Standard Library itertools bereits die Funktionalität, die Sie implementieren möchten. Auch Sie verwenden es in Ihrem Code (lustig).

itertools.combinations(a,3) gibt alle 3-Kombinationen der a zurück. Um dies zu "Liste der Liste" zu konvertieren, sollten Sie .extend() wie folgt verwenden;

x = ['a','b','c','d','e'] 
n = 3 
import itertools 
permutations = [] 
combinations = [] 
combinations.extend(itertools.combinations(x,n)) 
permutations.extend(itertools.permutations(x,n)) 

print("Permutations;", permutations) 
print("\n") 
print("Combinations;", combinations) 

Zusätzlich empfehle ich Ihnen auf "Combination, Permutation Difference" zu suchen. Wie ich aus deiner Frage verstand; Permutation ist was du willst. (. Wenn Sie den Code, den ich geteilt laufen, werden Sie verstehen, den Unterschied easliy)

0

Um zu verstehen, wie die Lösung Prozess funktioniert, versuchen Sie die folgenden:

# get all combinations of n items from given list 
def getCombinations(items, n): 
    if len(items) < n: return [] # need more items than are remaining 
    if n == 0: return [''] # need no more items, return the combination of no items 

    [fst, *rst] = items 

    # all combinations including the first item in the list 
    including = [fst + comb for comb in getCombinations(rst, n-1)] 

    # all combinations excluding the first item in the list 
    excluding = getCombinations(rst, n) 

    both = including + excluding 
    return both 

x = ['a','b','c','d','e'] 
n = 3 
print(getCombinations(x, n)) 
# ['abc', 'abd', 'abe', 'acd', 'ace', 'ade', 'bcd', 'bce', 'bde', 'cde'] 
+0

Sind die Permutationen alle einzigartig? –

+0

Dies erzeugt Kombinationen, aber keine Permutationen. d.h. es enthält "abc" und nicht "bac". Es geht davon aus, dass die Elemente in der Liste eindeutig sind. Wenn Sie also "['a', 'a', 'b'] 'eingeben, erhalten Sie zwei' 'ab'-Zeichen. –

+0

Ich bin ein wenig verwirrt über den Unterschied. Permutationen scheinen mehr Kombinationsmöglichkeiten zu geben, wenn sie nicht gleich sind? –

0

Kombinationen arbeitet auf Strings nicht Listen, so verwenden Sie sollten zuerst in einen String drehen: ''.join(x)

from itertools import combinations 
x = ['a', 'b', 'c', 'd', 'e'] 
n = 3 
aa = combinations(''.join(x), n) 
for comb in aa: 
    print(''.join(comb)) 

OUTPUT

abc 
abd 
abe 
acd 
ace 
ade 
bcd 
bce 
bde 
cde 

Oder als Einzeiler:

[''.join(comb) for comb in combinations(''.join(x), n)] 
Verwandte Themen