2016-04-15 21 views
0

Ich bin ein Sudoku in Python zu tun, und ich habe ein kleines Problem wissen, wie soll ich Daten aus einer Datei erhaltenExtrahieren von Daten aus .txt

so dass ich mit einer Datei haben, die wie folgt aussieht:

.3. ... ... 
..8 39. 6.. 
5.1 2.. 49. 
.7. 6.. ... 
2.. ... .4. 
... 5.3 98. 
... ... 15. 
... ..7 ..9 
4.. .1. 3.. 

alle neun Punkte, es ist ein "\ n"

Wie kann ich die Daten?

Im Moment haben, ich habe genau das:

import os 

f = open('sudo.txt', 'r') 
lines = f.read() 
f.close() 

sudoku = lines 

print(sudoku) 
os.system("pause") 

für Ihre Hilfe Danke.

+1

Lösen eines Sudoku programmatisch und eine Datei in Python sind zwei völlig unterschiedliche Konzepte zu lesen. Ich bearbeite jede Anfrage, um das Sudoku zu lösen (was eine separate Frage sein muss und sicherlich zu weit gefasst sein wird, was eher wie "Mach meine Hausaufgaben bitte" klingt) –

Antwort

0

Python - Schleifenkonstrukte können grundsätzlich über alles, einschließlich Strings, iterieren. Für so etwas müssen Sie lediglich die Zeichenfolge in den Zeilenumbrüchen aufteilen, um die Zeilen zu trennen, und dann diese Zeilen durchlaufen und in die Zeilen einfügen Array, wenn sie nicht zu den Feldern gehören, die die Boxen voneinander trennen. Angenommen, Sie möchten das Board in einem 2D-Array haben, dann wird dieses Listenverständnis das tun, was Sie fragen.

sudoku = [[character for character in line if not character==" "] for line in lines.split("\n")] 
+0

Vielen Dank! schnell und prägnant. Nur eine kleine Frage, was genau ist x und y? – Ravaniss

+0

y ist jede Zeile, weil sie das von lines.split zurückgegebene Array durchläuft ("\ n"), und x ist jedes Zeichen in der Zeile y. Ich habe meinen Beitrag bearbeitet, um mehr beschreibende Variablennamen zu haben – Natecat

0

readlines werden die Daten in Zeilen aufteilen. Verwenden Sie auch immer die with-Anweisung, wenn Sie Dateien öffnen.

with open('sudo.txt') as f: 
    lines = f.readlines() 

Man könnte es dann mit geteiltem analysiert weiter:

soduku = [[list(group) for group in line.split()] for line in lines] 

die Ihre Daten in diesem Format setzen würde:

[[['.', '3', '.'], ['.', '.', '.'], ['.', '.', '.']], 
[['.', '.', '8'], ['3', '9', '.'], ['6', '.', '.']], 
[['5', '.', '1'], ['2', '.', '.'], ['4', '9', '.']], 
[['.', '7', '.'], ['6', '.', '.'], ['.', '.', '.']], 
[['2', '.', '.'], ['.', '.', '.'], ['.', '4', '.']], 
[['.', '.', '.'], ['5', '.', '3'], ['9', '8', '.']], 
[['.', '.', '.'], ['.', '.', '.'], ['1', '5', '.']], 
[['.', '.', '.'], ['.', '.', '7'], ['.', '.', '9']], 
[['4', '.', '.'], ['.', '1', '.'], ['3', '.', '.']]] 
+0

Dies beantwortet die Frage nicht, er fragt, wie man die Daten in einem Format erhält, das für die Ausführung von Algorithmen geeignet ist. – Natecat

+0

Sie haben Recht, aber das schien die erste Hürde zu beantworten, die sie erreichten. Ich habe aktualisiert. –

2

Dies als der eigentlich viel schwieriger eine Frage andere Antworten scheinen in Erwägung zu ziehen. Vor allem lösen die Sudoku (die außerhalb des Umfangs dieser Frage ist)

Überlegen Sie, welche Art von Datenstruktur Sie wollen. Ich könnte mir vorstellen, Sie list in einer benutzerdefinierten Klasse es umfunktionieren wollen würde

class Puzzle(list): 
    pass 

und dann passieren eine Liste von jeder Zahl nach rechts oben links nach unten, vielleicht mit Null (0) als Leerraum, Das heißt, Ihr Konstruktor sollte

Puzzle([0,3,0,0,0,0,0,0,0,0,0,8,3,9,0,6,0,0, ... ]) 

Wie würden Sie dies aus Ihren Zieldaten lesen? Nun, eine Stelle nach der anderen.

with open("filename.txt") as inf: 
    puzzle = [ 
     [0 if el == '.' else int(el) for el in line if el.strip()] 
     for line in inf] 

Diese Liste comp ist ein bisschen wie ein Bissen. Lass uns durchgehen.

puzzle = [ ... ] 

Grundlegende Liste comp Syntax. Nichts zu sprechen hier

[ [ 0 if el == '.' else int(el) for el in line if el.strip() ] ... ] 

Dies ist der Mund voll ist, aber es ist im Grunde nur eine geschachtelte Liste comp.Dieses sagt

[ 0 if el == '.' 
# if the character is a period (.), use a zero (0) 
else int(el) 
# otherwise, cast the character to integer since it's a number 
for el in line 
# we're iterating over each character in the string line 
if el.strip() 
# and selecting every "truthy" character (e.g. skipping the spaces) 

Der Rest ist einfach

[ ... for line in inf] 
# "line" is each literal line in the file. 
+0

Wenn ich mich nicht irre, "wenn el" nichts tut, werden Sie beim Durchlaufen einer Zeichenkette niemals auf eine leere Zeichenkette stoßen. – Natecat

+0

@Natecat Whoops du hast Recht. Ich habe versucht, die Räume auszuwählen, aber ich habe einen '.strip'-Anruf verpasst. ('" ".strip()' ist falsch) –