Seite 1 von 1

print befehl in Liste nur einmal ausführen

Verfasst: Freitag 6. November 2015, 00:57
von 78gradn
Hallo zusammen

ich habe eine kleine dynamische Liste in welcher der Benutzer den Listennamen selber definieren kann.
Mittels if und else wird überprüft, ob der vom Benutzer eingegebene Name bereits existiert.
Die Rückmeldung "Name existiert" erfolgt wie gewünscht im Ausgabefenster.
Aber eben so oft wie die Schleife durchläuft.
Ich hätte aber gerne dass die Rückmeldung nur einmal kommt, aber dennoch in der Schleife drinnen ist.

Hier mein Script:
..............................................................................
Liste = [1,2,3,4,5,6]
Name = raw_input("Bitte definieren Sie einen Namen:")
for x in Liste:
Liste_a = Name + "_" + str(x)
if Name:
print Liste_a
print "it exists"
else:
print "dont exist"

print "Thank you for help"
..................................................................................
(ist verhältnismässig sinnfrei, veranschaulicht aber meine Frage und dient nur Übungszwecken).
Ich würde mir als Ergebnis wünsche:
it exists
Name_1
Name_2
Name_3
Name_4
Name_5
Name_6
Thank you for help

was ich mit oben angeführtem Script bekomm ist aber:
Name_1
it exists
Name_2
it exists
Name_3
it exists
Name_4
it exists
Name_5
it exists
Name_6
it exists
Thank you for help.

Kann mir jemand von Euch verraten, was ich da anders machen muss?
Vielen Herzlichen Dank im voraus und liebe Grüsse
Marla

Re: print befehl in Liste nur einmal ausführen

Verfasst: Freitag 6. November 2015, 05:08
von noisefloor
Hallo,

könntest du den Code bitte mal in einem Code-Block posten (bekommst du, indem du auf die Schaltfläche "Code" oberhalb des Eingabefensters klickst), damit man die Einrückung sieht und so auch, was zusammengehört und was nicht.

Ansonsten ist `if Name:` relativ sinnlos, weil das immer `True` ist, wenn der Nutzer bei `raw_input` was eingibt.

Gruß, noisefloor

Re: print befehl in Liste nur einmal ausführen

Verfasst: Freitag 6. November 2015, 08:07
von 78gradn
Hier der Code im Codeblock, ich hoff ich hab das so richtig gemacht:

[Codebox=pys60 file=Unbenannt.txt]Liste = [1,2,3,4,5,6]
Name = raw_input("Bitte definieren Sie einen Namen:")
for x in Liste:
Liste_a = Name + "_" + str(x)
if Name:
print Liste_a
print "it exists"
else:
print "dont exist"

print "Thank you for help"[/Codebox]

vielen Dank vorab
Marla

Re: print befehl in Liste nur einmal ausführen

Verfasst: Freitag 6. November 2015, 08:56
von Sirius3
@78gradn: Da sich Name innerhalb der for-Schleife nicht ändert, kann man die if-Abfrage auch vor die Schleife ziehen, und Du erhältst Dein gewünschtes Ergebnis:

Code: Alles auswählen

Liste = [1,2,3,4,5,6]
Name = raw_input("Bitte definieren Sie einen Namen:")
if Name:
    print "it exists"
else:
    print "dont exist"

for x in Liste:
    print "{}_{}".format(Name, x)

print "Thank you for help"
Aber wie noisefloor schon geschrieben hat, der Code ist so sinnlos, dass er nicht mal als Veranschaulichung dient. Was möchtest Du denn wirklich erreichen?

Re: print befehl in Liste nur einmal ausführen

Verfasst: Samstag 7. November 2015, 07:38
von 78gradn
Hallo zurück
danke für die Hinweise. Bin recht neu in der Materie. War mir deshalb nicht klar, dass dass oben geschriebene nix bringt.
Hier der eigentliche Code.
Konkret geht es um den Teil aber buffer = [10, 30, ...].

wie gesagt, ich schaff es nicht, dass sich dieses Buffer erstellt nicht ständig widerholt. Ich hätte gerne
dass sich "Buffer erstellt" nur einmal darstellt und dann darunter die Werte.


Code: Alles auswählen

# Autor: Marla Hofbauer
# Datum: 3.11.2015
# Berechnung von Distanzen zu den Zufahrtsstrassem zum Flughafen Genf
# Buffer-Script um eine Schleife für die wiederholte Ausführung erweitern

import arcpy  
arcpy.env.overwriteOutput = 1  
cpy.env.workspace = "C:\\geneve.mdb"  

strassen = "rue_geneve"

if arcpy.Exists(strassen): 
     print "Datensatz strassen vorhanden"
     
else: 
     print "Datensatz strassen nicht vorhanden"
     
buffer = [10,300,500,70,100]
vorsilbe = raw_input("Buffername eingeben:")
for x in buffer:
	B1 = buffer + "_" + str(x)
	if arcpy.Exists(B1):
		unique_name = arcpy.CreateUniqueName
		"damit kreiert das System selbst einen passenden namen"
		B2 = unique_name + "_" + str(x)
		arcpy.Buffer_analysis(strassen, B2, x, "FULL", "ROUND", "ALL")
		print "buffer erstellt"
		print B2
		
	else:
		arcpy.Buffer_analysis(strassen, Buffer, x, "FULL", "ROUND", "ALL")
		print "buffer erstellt"
		print B1
	
		
print "Buffer erstellt"
Herzlichen Dank nochmals für Eure Hilfe und schönes WE.
Marla

Re: print befehl in Liste nur einmal ausführen

Verfasst: Samstag 7. November 2015, 09:09
von Kebap
78gradn hat geschrieben:Bin recht neu in der Materie. (...)
wie gesagt, ich schaff es nicht, dass sich dieses Buffer erstellt nicht ständig widerholt. Ich hätte gerne
dass sich "Buffer erstellt" nur einmal darstellt und dann darunter die Werte.
Dazu ziehst du die entsprechende Befehle unter die Schleife, so dass sie nicht mehr im Rumpf der Schleife stehen, und bei jedem Lauf ausgeführt werden, sondern im normalen Block nach der Schleife. Im besten Fall kannst du die Schleifenlogik in ihren eigene Funktion auslagern. Es empfiehlt sich immer, reine Programmlogik von der Ein- & Ausgabe wie zB print zu trennen.

Re: print befehl in Liste nur einmal ausführen

Verfasst: Samstag 7. November 2015, 09:26
von 78gradn
aber dann schreibt es mir beide alternativen in die Ausgabe, oder nicht?
Ich muss das ja so hinkriegen,
dass mir im Falle, dass der eingegebene Name noch frei ist das Statement zu B1 ausgegeben wird (und B2 nicht)
und falls der eingegebene Name bereits existiert muss das statement zu B2 ausgegeben werden.

Also nur einfach drunterschreiben kann ich nicht, oder?
muss ich dann auch wieder etwas mit if und else machen?

Kebab: du hast mir ja jetzt schon mehrmals geholfen. Vielen herzlichen Dank für dein Engagement!

Re: print befehl in Liste nur einmal ausführen

Verfasst: Samstag 7. November 2015, 18:05
von Sirius3
@78gradn: wenn Du Deine Fragen genauso unkonzentriert schreibst, wie Deinen Code, ist es wirklich schwierig, Dir zu helfen. Wenn ich Dich richtig verstehe, willst Du 5 Namen erzeugen, die eine eindeutige Vorsilbe haben. Dann solltest Du das auch machen, bevor Du etwas mit den Namen anfängst.

Code: Alles auswählen

buffer = [10,300,500,70,100]
while True:
    vorsilbe = raw_input("Buffername eingeben:")
    if not any(arcpy.Exists("{}_{}".format(vorsilbe, x)) for x in buffer):
        break
    print "Buffer existiert schon"

for x in buffers:
    name = "{}_{}".format(vorsilbe, x)
    arcpy.Buffer_analysis(strassen, name, x, "FULL", "ROUND", "ALL")

Re: print befehl in Liste nur einmal ausführen

Verfasst: Samstag 7. November 2015, 19:50
von 78gradn
Vielen Dank für die Kritik. Ehrlich gesagt hab ich sie nicht ganz verstanden.
Was genau meinst du mit unkonzentriert. Also, was hätte ich anders machen müssen, damit es konzentriert wirkt?
vg

Re: print befehl in Liste nur einmal ausführen

Verfasst: Samstag 7. November 2015, 20:28
von Sirius3
unkonzentriert, weil:
Zeile 8: cpy statt arcpy
Zeile 21: buffer statt vorsilbe
Zeile 23: Funktion aufrufen, statt referenzieren
Zeile 31: Buffer statt B1

Sollte eigentlich beim ersten Ausführen auffallen.

Re: print befehl in Liste nur einmal ausführen

Verfasst: Samstag 7. November 2015, 20:35
von 78gradn
oh ja, da hast du recht.
werd beeser drauf achten.
Vielen Dank.