print befehl in Liste nur einmal ausführen

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
78gradn
User
Beiträge: 18
Registriert: Dienstag 13. Oktober 2015, 21:15

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
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
78gradn
User
Beiträge: 18
Registriert: Dienstag 13. Oktober 2015, 21:15

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
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
78gradn
User
Beiträge: 18
Registriert: Dienstag 13. Oktober 2015, 21:15

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
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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.
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.
78gradn
User
Beiträge: 18
Registriert: Dienstag 13. Oktober 2015, 21:15

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!
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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")
78gradn
User
Beiträge: 18
Registriert: Dienstag 13. Oktober 2015, 21:15

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
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
78gradn
User
Beiträge: 18
Registriert: Dienstag 13. Oktober 2015, 21:15

oh ja, da hast du recht.
werd beeser drauf achten.
Vielen Dank.
Antworten