NoPaste

mischkultur_additiv.py

von Huo

SNIPPET_TEXT:
  1. #!/usr/bin/env python3
  2.  
  3. #======================================================================
  4. # Gute und schlechte Pflanzennachbarn müssen in zwei getrennten csv-Dateien
  5. # friends.csv und enemies.csv
  6. # in der Form PFLANZE1,PFLANZE2 hinterlegt sein (ein Paar pro Zeile)
  7. #
  8. # Die Pfade in den Zeilen 21 und 22 sind bei Bedarf anzupassen!
  9. #
  10. # Aufruf:
  11. #     mischkultur.py HAUPTPFLANZE
  12. # wobei HAUPTPFLANZE ein einzelner Name aus der Datei friends.csv ist
  13. #======================================================================
  14.  
  15. import csv
  16. import itertools
  17. import os
  18. import sys
  19.  
  20. # Einlesen der beiden csv-Dateien (Pfade bei Bedarf anpassen!) als Listen zwei-elementiger Mengen
  21. friends = sorted(list(sorted(list(line)) for line in csv.reader(open(os.path.expanduser("~/friends.csv")))))
  22. enemies = sorted(list(sorted(list(line)) for line in csv.reader(open(os.path.expanduser("~/enemies.csv")))))
  23.  
  24. # Plausibilitätsprüfung der Listen auf widersprüchliche Nachbarbeziehungen
  25. if [s for s in friends if s in enemies] != []:
  26.     print("Pflanzenpaar darf nicht zugleich in friends.csv und enemies.csv liegen")
  27.     print("Dubletten:", [s for s in friends if s in enemies])
  28.     sys.exit(1)
  29.    
  30. # Check Parameter
  31. if not [i for i in friends if sys.argv[-1] in i] or len(sys.argv) != 2:
  32.     print("Script muss mit einer Einzelpflanze aus friends.csv als einzigem Parameter aufgerufen werden!")
  33.     sys.exit(1)    # Abbruch bei Aufruf ohne Parameter oder mit falschem Parameter
  34.  
  35. hauptpflanze = sys.argv[1]
  36.  
  37. # Liste der guten Nachbarn der Hauptpflanze
  38. friends_h = []
  39. gute_nachbarn = []
  40. for pair in friends:
  41.     if hauptpflanze in pair:
  42.         pair.remove(hauptpflanze)
  43.         friends_h.append([pair[0]])
  44.         gute_nachbarn.append(pair[0])
  45. print ("Gute Nachbarn von", hauptpflanze + ":")
  46. print(*gute_nachbarn, sep=", ")
  47. print()
  48.  
  49. # Liste aller Paare unter den Freunden der Hauptpflanze
  50. friends_h_paired = list(list(s) for s in itertools.combinations(gute_nachbarn, 2))
  51.  
  52. # darunter schlechte Nachbarn
  53. enemies_c = list(s for s in friends_h_paired if s in enemies)
  54. print ("Darunter harmonieren nicht:")
  55. print (*enemies_c, sep="\n")
  56. print()
  57.  
  58. gruppen_pre = friends_h
  59. mischkulturen = []   # Liste der nicht erweiterbaren Gruppen
  60. N = 2   # Anzahl/Pflanzen in den zu ermittelnden Gruppen
  61.  
  62. # Ermittlung der Gruppen mit N Pflanzen (gruppen_n) aus den Gruppen mit (N - 1) Pflanzen (gruppen_pre)
  63. # Schleife wird abgebrochen, wenn weniger als N Gruppen mit N - 1 Pflanzen ermittelt wurden
  64. while len(gruppen_pre) > N - 1:
  65.     n = N - 2
  66.     gruppen_n = []
  67.     i = 0
  68.     for p in gruppen_pre:
  69.         i += 1
  70.         for q in gruppen_pre[i:]:
  71.             if p[0:n] == q[0:n] and not [p[n],q[n]] in enemies:
  72.                  union = sorted(list(set(p + q)))
  73.                  gruppen_n.append(union)
  74.  
  75.     # Nicht erweiterbare Mischkulturen mit n +1 Pflanzen
  76.     # (= nicht als Teilmenge in einer Gruppe mit n + 2 Pflanzen enthalten)
  77.     for s in gruppen_pre:
  78.         if all( not all(x in gruppe for x in s) for gruppe in gruppen_n ):
  79.             mischkulturen.append([hauptpflanze] + s)
  80.  
  81.     gruppen_pre = gruppen_n
  82.     N += 1
  83.  
  84. # Hinzufügen der größten nicht-erweiterbaren Mischkulture(n) außerhalb der Schleife
  85. for s in gruppen_pre:
  86.    mischkulturen.append([hauptpflanze] + s)
  87.  
  88. # Ausgabe der Mischkulturen (sortiert nach Größe)
  89. print ("Mögliche Mischkulturen:")
  90. print(*mischkulturen, sep='\n')

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN