#!/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')