mischkultur_additiv.py
von Huo- SNIPPET_TEXT:
-
- #!/usr/bin/env python3
- #======================================================================
- # Gute und schlechte Pflanzennachbarn müssen in zwei getrennten csv-Dateien
- # friends.csv und enemies.csv
- # in der Form PFLANZE1,PFLANZE2 hinterlegt sein (ein Paar pro Zeile)
- #
- # Die Pfade in den Zeilen 21 und 22 sind bei Bedarf anzupassen!
- #
- # Aufruf:
- # mischkultur.py HAUPTPFLANZE
- # wobei HAUPTPFLANZE ein einzelner Name aus der Datei friends.csv ist
- #======================================================================
- import csv
- import itertools
- import os
- import sys
- # Einlesen der beiden csv-Dateien (Pfade bei Bedarf anpassen!) als Listen zwei-elementiger Mengen
- friends = sorted(list(sorted(list(line)) for line in csv.reader(open(os.path.expanduser("~/friends.csv")))))
- enemies = sorted(list(sorted(list(line)) for line in csv.reader(open(os.path.expanduser("~/enemies.csv")))))
- # Plausibilitätsprüfung der Listen auf widersprüchliche Nachbarbeziehungen
- if [s for s in friends if s in enemies] != []:
- print("Pflanzenpaar darf nicht zugleich in friends.csv und enemies.csv liegen")
- print("Dubletten:", [s for s in friends if s in enemies])
- sys.exit(1)
- # Check Parameter
- if not [i for i in friends if sys.argv[-1] in i] or len(sys.argv) != 2:
- print("Script muss mit einer Einzelpflanze aus friends.csv als einzigem Parameter aufgerufen werden!")
- sys.exit(1) # Abbruch bei Aufruf ohne Parameter oder mit falschem Parameter
- hauptpflanze = sys.argv[1]
- # Liste der guten Nachbarn der Hauptpflanze
- friends_h = []
- gute_nachbarn = []
- for pair in friends:
- if hauptpflanze in pair:
- pair.remove(hauptpflanze)
- friends_h.append([pair[0]])
- gute_nachbarn.append(pair[0])
- print ("Gute Nachbarn von", hauptpflanze + ":")
- print(*gute_nachbarn, sep=", ")
- print()
- # Liste aller Paare unter den Freunden der Hauptpflanze
- friends_h_paired = list(list(s) for s in itertools.combinations(gute_nachbarn, 2))
- # darunter schlechte Nachbarn
- enemies_c = list(s for s in friends_h_paired if s in enemies)
- print ("Darunter harmonieren nicht:")
- print (*enemies_c, sep="\n")
- print()
- gruppen_pre = friends_h
- mischkulturen = [] # Liste der nicht erweiterbaren Gruppen
- N = 2 # Anzahl/Pflanzen in den zu ermittelnden Gruppen
- # Ermittlung der Gruppen mit N Pflanzen (gruppen_n) aus den Gruppen mit (N - 1) Pflanzen (gruppen_pre)
- # Schleife wird abgebrochen, wenn weniger als N Gruppen mit N - 1 Pflanzen ermittelt wurden
- while len(gruppen_pre) > N - 1:
- n = N - 2
- gruppen_n = []
- i = 0
- for p in gruppen_pre:
- i += 1
- for q in gruppen_pre[i:]:
- if p[0:n] == q[0:n] and not [p[n],q[n]] in enemies:
- union = sorted(list(set(p + q)))
- gruppen_n.append(union)
- # Nicht erweiterbare Mischkulturen mit n +1 Pflanzen
- # (= nicht als Teilmenge in einer Gruppe mit n + 2 Pflanzen enthalten)
- for s in gruppen_pre:
- if all( not all(x in gruppe for x in s) for gruppe in gruppen_n ):
- mischkulturen.append([hauptpflanze] + s)
- gruppen_pre = gruppen_n
- N += 1
- # Hinzufügen der größten nicht-erweiterbaren Mischkulture(n) außerhalb der Schleife
- for s in gruppen_pre:
- mischkulturen.append([hauptpflanze] + s)
- # Ausgabe der Mischkulturen (sortiert nach Größe)
- print ("Mögliche Mischkulturen:")
- print(*mischkulturen, sep='\n')
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN