Ich verwende Python, um zwei Dateien zusammenzuführen, um eine neue zu erstellen. Die Daten in beiden Dateien haben am Anfang jeder Zeichenfolge, die ich sortieren möchte, eine ID, sodass beide in derselben Reihenfolge sind und zusammengeführt werden können. Dazu habe ich .sort () verwendet, damit beide in derselben Reihenfolge angeordnet sind und die Kommentare mit den Details übereinstimmen. Ich möchte sie jetzt jedoch neu anordnen, sodass sie 1, 2, 3, 4 ... anstelle von 1, 10, 100, 1000, 1001, 1002 usw. sind, aber ich habe Schwierigkeiten, da die Nummer der Anfang von ist Eine Zeichenfolge und Python konvertieren die ersten vier Zeichen einer Zeichenfolge nicht in eine Ganzzahl. Wenn es sich um eine Hilfe handelt, handelt es sich auch um eine durch Tabulatoren getrennte Datei, und die nächste Information nach der ID ist das Datum.

Irgendwelche Ideen wären willkommen und im Idealfall möchte ich keine Bibliotheken importieren.

Mein Code ist:

comments = R'C:\Pythonfile\UFOGB_Comments.txt'
details = R'C:\Pythonfile\UFOGB_Details.txt'
mydest = R'C:\Pythonfile\UFOGB_sorted.txt'

with open(details,'rt') as src:
    readdetails = src.readlines()
    readdetails.sort()

with open(comments,'rt') as src:
    readcomments = src.readlines()
    readcomments.sort()

with open(mydest, 'w') as dest:
    for i in range(len(readdetails)):
        cutcomm = readcomments[i][readcomments[i].find('"'):]
        dest.write('{}\t{}'.format(readdetails[i].strip('\n'),cutcomm))
0
user9103716 18 Apr. 2018 im 11:59

3 Antworten

Beste Antwort

Sie könnten versuchen, das erste Feld als int mit zu analysieren:

readdetails.sort(key=lambda x: int(x.split()[0]))

Dies funktioniert gut, wenn alle Zeilen in einem konsistenten Format vorliegen.

Verwenden Sie andernfalls eine komplexere Funktion als Schlüsselfunktion für list.sort (), z.

def extract_id(line):
    # do something with line
    # and return an integer, or another kind of value

Und übergeben Sie es an die Sortierfunktion:

readdetails.sort(key=extract_id)
0
fferri 18 Apr. 2018 im 09:11

Ich habe versucht, Ihre Daten gemäß Ihrer Erklärung neu zu erstellen. Sag mir, ob das richtig ist:

lines = """
123   foobar
1000  foobar
432   foobar
22    foobar
987   foobar
""".strip().split('\n')

print(lines)
lines.sort(key=lambda s: int(s[:4]))
print(lines)

Ergebnis:

['123   foobar', '1000  foobar', '432   foobar', '22    foobar', '987   foobar'] # initial
['22    foobar', '123   foobar', '432   foobar', '987   foobar', '1000  foobar'] # final

Ich nehme an, dass Ihre Ganzzahl-ID auf 4 Stellen begrenzt ist, wie Sie im OP gesagt haben. Wenn die ID-Größe variabel ist, können Sie einfach die Sortierfunktion ersetzen:

lines.sort(key=lambda s: int(s.split()[0]))
0
sciroccorics 18 Apr. 2018 im 09:19

Wenn Sie Schwierigkeiten haben, eine Liste nach den ersten vier Zeichen jedes Eintrags zu sortieren, versuchen Sie diese Methode unter https: //wiki.python.org/moin/HowTo/Sorting:

with open(details,'rt') as src:
    read_details = src.readlines()
    read_details = sorted(read_details, key=lambda detail: detail[:4])

with open(comments,'rt') as src:
    read_comments = src.readlines()
    read_comments = sorted(read_comments, key=lambda comment: comment[:4])

Ich bin mir nicht ganz sicher, was Sie mit dem letzten Teil erreichen möchten - ein Beispiel dafür, was Sie in den Kommentaren und Detaildateien haben, mit einem Beispiel dafür, wie ein Eintrag im Ziel aussehen soll, wäre nützlich.

0
Robert Hamilton 18 Apr. 2018 im 09:29