CSV-Reader: Schleife in Schleife

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RolandKM
User
Beiträge: 25
Registriert: Montag 21. Dezember 2020, 10:20

Hallo,
ich möchte mittels csv.reader die erste Zeile einer Textdatei lesen und mit allen folgenden Zeilen (2..x) vergleichen, danach die zweite Zeile lesen und mit allen folgenden Zeilen (3..x) vergleichen. Mit folgender Syntax funktioniert das nur für die erste Zeile im Vergleich mit allen weiteren:

Code: Alles auswählen

    with open(filename_input, 'r') as csvdatei:
        csv_reader = csv.reader(csvdatei, delimiter=',')
        for zeile1 in csv_reader:
        ...
        	for zeile2 in csv_reader:
        	...
Wie komme ich wieder in die äußere Schleife zurück ?

M f G
RolandKM
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was ist das eigentliche Ziel hier? Denn was du da machst ist ein quadratischer Algorithmus von der Laufzeit her, und das ist eher schlecht. Ggf. waere ein sortieren und dann einmal auf Dubletten vergleichen deutlich besser. Konzeptionell koennte das so aussehen:

Code: Alles auswählen

import itertools
import random


def generate_test_data():
    return [random.choice("ABCDEFG") for _ in range(100)]


def main():
    test_data = generate_test_data()
    test_data = sorted(test_data)
    for key, group in itertools.groupby(test_data):
        print(key, len(list(group)))


# main guard
if __name__ == '__main__':
    main()
RolandKM
User
Beiträge: 25
Registriert: Montag 21. Dezember 2020, 10:20

Ich habe eine Datei mit Punktkoordinaten (nr, x, y) und möchte alle Punkte ermitteln, deren Abstand einen vorgegebenen Wert unterschreitet. Dazu vergleiche ich den ersten Punkt mit allen weiteren (2..x) und berechne jeweils den Abstand. Danach vergleiche ich den 2. Punkte mit mit allen weiteren (3...x) u.s.w.
Der csv.reader ist ja ideal für solche Dateien. Bei mir läuft nur die innere Schleife korrekt durch, die äußere dagegen nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@RolandKM: Der Iterator den `csv.reader()` liefert, kann man nur einmal durchlaufen. Wenn Du über die selben Daten mehrfach iterieren willst, musst Du sie erst komplett in den Speicher zum Beispiel in eine Liste laden. Und dann kann man `itertools.combinations()` verwenden um sich alle Kombinationen von Datensätzen in *einer* Schleife geben zu lassen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
RolandKM
User
Beiträge: 25
Registriert: Montag 21. Dezember 2020, 10:20

@__blackjack__ : Danke für den Tipp !
Ich habe das Ganze mit datei.readlines() und zwei ineinander geschachtelten for-Schleifen gelöst. Funktioniert !
Sirius3
User
Beiträge: 17755
Registriert: Sonntag 21. Oktober 2012, 17:20

@RolandKM: Warum?
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Wenn es funktioniert, ist es ja gut!
Besser wäre, das Rad nicht neu zu erfinden, und den Tipp zu itertools weiter zu verfolgen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten