2016-07-10 11 views
1

Ich habe ein Programm zum Aufzählen der Benutzer mit Administratorrechten auf Windows. Ich möchte auch die Anzahl der gefundenen Konten anzeigen, die in einer Variablen namens num_administrator gespeichert ist. Ich habe das folgende Stück Code:bedingte Anzeige von Zeichenfolge in Python

if num_administrators > 1: 
    print("[*] {} accounts with administrative privileges found:\n".format(num_administrators)) 
    show_admins() 
elif num_administrators == 1: 
    print("[*] {} account with administrative privileges found:\n".format(num_administrators)) 
    show_admins() 
else: 
    print("[*] No accounts with administrative privileges found.\n") 

Wenn es nicht admins sind, würde ich [*] No accounts with administrative privileges found. drucken möchten Wenn ein oder mehrere Administratoren ist die Nachricht angezeigt werden fast das gleiche, der einzige Unterschied ist die Anzeige von account oder accounts entsprechend der Nummer. Es ist nur eine Frage von 1 Brief (s). Kann ich den bedingten Druck nur mit einer eindeutigen Aussage oder auf eine einfachere Art und Weise erzielen? Ist es möglich, so etwas wie zu drucken:

print("[*] {} account".format(num_administrators) + if num_administrators > 1 "s" + "with administrative privileges found:\n") 

Sie meinen Code nicht über nichts, ich weiß nicht, die Syntax, wenn, was ich mache Sinn macht, es ist nur Sie, was eine Idee zu geben I Ich denke, und du kannst mir sagen, ob es machbar ist oder nicht.

Außerdem rufe ich die Funktion show_admins() 3 mal (zum Drucken der Admin-Konten), aber eigentlich kann ich es nur einmal am Ende rate ich denke.

+1

einfach Ihre Einzüge 4 Leerzeichen rückwärts bewegen - Ihre Elif und sonst nie halten, wie sie innerhalb wenn sind. – dmitryro

+0

@ dmitryro Wenn das der Fall wäre, würde er einen 'SyntaxError' bekommen. Du kannst kein 'elif' ohne' if' haben. Wahrscheinlich nur ein Kopier- und Einfügefehler. – Bakuriu

+1

Mögliches Duplikat von [Python bedingte Zeichenformatierung] (http://stackoverflow.com/questions/9244909/python-conditional-string-formatting) –

Antwort

2

Hier ist ein schlauer Einzeiler ich gemacht:

"[*] {} account{} with administrative privileges found.\n".format("No" if num_administrators == 0 else str(num_administrators), "s" if num_administrators != 1 else "") 

P. S. Wie für die Lesbarkeit, weiß ich nicht ... ich vielleicht falsch sein, aber ich glaube, meine Augen

+1

Bitte nie dies tun ;-) – IanAuld

+0

es sicherlich nicht zu PEP 8: Zeile zu lang (175> 79 Zeichen), aber ich liebe dieses One-Liner :) – Fabio

0

Sie bluten etwas wie

if num_administrators > 1: 
     print "The total number of administrators is %d"%(num_administrators) 

tun können, oder, wenn Sie es wollen eine Zeichenfolge sein :

if num_administrators > 1: 
     print "The total number of administrators is %s"%(str(num_administrators)) 

Also hier der einfachste Weg ist Lambda zu verwenden:

l = lambda x:'No' if x == 0 else x 
print("[*] {} accounts with adminstrative priveleges".format(l(num_admin))) 
+0

Sie haben Recht, dies ist ein Weg, um das Problem zu vermeiden alle zusammen. Ich wäre immer noch daran interessiert, einen eleganteren Weg zu finden, genau das zu erreichen, was ich gefragt habe. – Fabio

+1

Wahrscheinlich Lambda, die Sie zurückgibt Nein oder die Nummer ist der einfachste Weg, es zu tun. – dmitryro

+0

Ich mag Ihre Lösung mit Lambda, weil sie übersichtlich und lesbar ist. Es gibt auch einen anderen ähnlichen Weg, den ich mit bedingten Anweisungen gefunden habe. Ich möchte auch den Fall num_admin == 1 – Fabio

1

Wenn Sie mit einer Zeile Lösung gehen wollen, dass‘ s wurde hier bereits beantwortet. Verwendung von if/else-Anweisungen, weil diese Weise jedoch würde ich empfehlen, die Lösung ist besser lesbar:

output = "[*] " 

if num_administrators > 1: 
    output += "{} accounts ".format(num_administrators) 
elif num_administrators == 1: 
    output += "1 account " 
else: 
    output += "No accounts " 

output += "with administrative privileges found:\n" 
+1

berücksichtigen Ich persönlich würde zuerst das if/else zuerst tun und dann die Formatierung über das Format z. '" [*] {} mit Administratorrechten gefunden: \ n ".format (account_string)'. Auf diese Weise ist es einfacher, die Nachricht zu erweitern. – syntonym

0

ich einen Blick nahm dmitryro ‚s Lösung und Ich mag die Verwendung von Lambda zur Anzeige verschiedene Strings je nach Bedingung. Ich möchte auch den Fall von num_admin == 1 berücksichtigen. Ich habe das Code und ich habe dies:

l = lambda x:"No accounts" if x == 0 else ("accounts" if x > 1 else "account") 

Dann habe ich ein wenig auch die Print-Anweisung bearbeitet:

print("[*] {} {} with administrative privileges found".format(num_admin, l(num_admin))) 

ich einen anderen Platzhalter hinzufügen musste {} für die Nummer angezeigt wird und ich fügte ein anderer Parameter num_admin in der format() Funktion.

Jetzt ist es fast perfekt, aber es ist immer noch ein Problem:

Beispiel:

für num_admin = 1 ich: [*] 1 account with administrative privileges found

für num_admin == 2 ich: [*] 2 accounts with administrative privileges found

aber für num_admin == 0 ich : [*] 0 No accounts with administrative privileges found

Ich möchte die Anzeige der Nummer 0 vor dem Satz vermeiden, jedenfalls denke ich, dass ich mein Leben verkompliziere und es wäre immer noch akzeptabel. Außerdem sollte ich die Lesbarkeit als einen wichtigen Aspekt betrachten.


nahm ich einen Blick auf An einem Freitag ‚s Antwort wieder und richtet sie tatsächlich dieses Problem:

ich in der Tat denken

print("[*] {} account{} with administrative privileges found.\n".format("No" if num_administrators == 0 else str(num_administrators), "s" if num_administrators != 1 else ""))

scheint eine perfekte Ein- Liner, obwohl ich stimme Lesbarkeit könnte ein Problem sein. Es haftet sicher nicht zu PEP 8:line too long (175 > 79 characters).

Ich mag auch diese Lösung, weil es Lambda vermeidet Verwendung und verwendet bedingte Ausdrücke, ich denke, es ist einfacher.

Siehe hier für eine Referenz:

- Conditional expressions

- Is there an equivalent of C’s ”?:” ternary operator?