Ich möchte ein Programm, das jede mögliche Kombination zu einer anderen Zeile einer Textdatei schreibt

StackOverflow https://stackoverflow.com/questions/241533

  •  04-07-2019
  •  | 
  •  

Frage

Ich möchte ein Programm schreiben, die jede Kombination aus einer Reihe von Variablen in eine Textdatei, die Schaffung einer Wortliste drucken. Jede Antwort sollte auf einer separaten Zeile geschrieben werden und alle Ergebnisse für 1 digit, 2-stellig und 3 Ziffern auf einer einzigen Textdatei schreiben.

Gibt es eine einfache Weise, die ich ein Python-Programm schreiben kann, die dies erreicht werden können? Hier ist ein Beispiel für die Ausgabe ich erwarte beim Drucken all binäre Zahl mögliche Kombinationen für 1, 2 und 3 Ziffern:

Output:
0  
1

00  
01  
10  
11

000  
001  
010  
011  
100  
101  
110  
111
War es hilfreich?

Lösung

Eine naive Lösung, die das Problem löst und ist allgemein genug, um für jede Anwendung, die Sie haben könnten, ist dies:

def combinations(words, length):
    if length == 0:
        return []
    result = [[word] for word in words]
    while length > 1:
        new_result = []
        for combo in result:
            new_result.extend(combo + [word] for word in words)
        result = new_result[:]
        length -= 1
    return result

Im Grunde ist dies baut allmählich einen Baum in Erinnerung an all die Kombinationen, und dann gibt sie. Es ist speicherintensiv, aber, und so ist unpraktisch für eine groß angelegte Kombinationen.

Eine andere Lösung für das Problem ist in der Tat, das Zählen zu verwenden, aber dann die Zahlen in eine Liste von Wörtern aus der Wortliste erzeugt zu transformieren. Dazu müssen wir zunächst eine Funktion (genannt number_to_list()):

def number_to_list(number, words):
    list_out = []
    while number:
        list_out = [number % len(words)] + list_out
        number = number // len(words)
    return [words[n] for n in list_out]

Das ist in der Tat ein System für Dezimalzahlen auf andere Basen umgewandelt werden. Wir schreiben dann die Zählfunktion; Dies ist relativ einfach, und wird den Kern der Anwendung bilden:

def combinations(words, length):
    numbers = xrange(len(words)**length)
    for number in numbers:
        combo = number_to_list(number, words)
        if len(combo) < length:
            combo = [words[0]] * (length - len(combo)) + combo
        yield combo

Dies ist ein Python-Generator; so dass es ein Generator ermöglicht es weniger RAM aufbrauchen. Es ist eine wenig Arbeit nach dem Einschalten der Nummer in eine Liste von Worten durchgeführt werden; Dies liegt daran, dass diese Listen Polsterung müssen, so dass sie in der gewünschten Länge. Es wäre wie folgt verwendet werden:

>>> list(combinations('01', 3))
[['0', '0', '0'], ['0', '0', '1'],
['0', '1', '0'], ['0', '1', '1'],
['1', '0', '0'], ['1', '0', '1'],
['1', '1', '0'], ['1', '1', '1']]

Wie Sie sehen können, erhalten Sie wieder eine Liste von Listen. Jede dieser Unterlisten enthält eine Folge der ursprünglichen Worte; Sie könnte dann so etwas wie map(''.join, list(combinations('01', 3))) tun das folgende Ergebnis zu erhalten:

['000', '001', '010', '011', '100', '101', '110', '111']

Sie könnten dann schreiben diese auf der Festplatte; jedoch eine bessere Idee wäre die integrierten in Optimierungen zu verwenden, die Generatoren und etwas tun, wie folgt aus:

fileout = open('filename.txt', 'w')
fileout.writelines(
    ''.join(combo) for combo in combinations('01', 3))
fileout.close()

Dies wird nur so viel RAM verwenden wie nötig (genug, um eine Kombination zu speichern). Ich hoffe, das hilft.

Andere Tipps

# Given two lists of strings, return a list of all ways to concatenate
# one from each.
def combos(xs, ys):
    return [x + y for x in xs for y in ys]

digits = ['0', '1']
for c in combos(digits, combos(digits, digits)):
    print c

#. 000
#. 001
#. 010
#. 011
#. 100
#. 101
#. 110
#. 111

Es sollte nicht zu schwer sein, in den meisten Sprachen. Ist die folgende Pseudo-Code Hilfe?

for(int i=0; i < 2^digits; i++)
{
     WriteLine(ToBinaryString(i));
}

Eine Grundfunktion, alle Permutationen einer Liste zu erzeugen, ist unten angegeben. Bei diesem Ansatz werden Permutationen unter Verwendung von Generatoren träge erstellt.

def perms(seq):
    if seq == []:
        yield []
    else:
        res = []
        for index,item in enumerate(seq):
            rest = seq[:index] + seq[index+1:]
            for restperm in perms(rest):
                yield [item] + restperm

alist = [1,1,0]
for permuation in perms(alist):
    print permuation
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top