einzelne Zahl in String hervorheben (nicht mit print)

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
TimeMen
User
Beiträge: 55
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Hallo,

Ich sammele Daten in einem String durch eine Schleife der ungefähr so aussieht:
choose = "1: 0:5 1:3 2:15 " usw..
Die Werte vor und nach den Doppelpunkten werden aus Arrays eingelesen. Ich möchte den höchsten Wert hinter dem Doppelpunkt gerne hervorheben. Am Besten farbig. Doch wie kann ich nun nur eine Zahl farbig kennzeichnen, ohne das direkt im im Print Befehl zu definieren?

LG
TimeMen
Eine Signatur ist ein Text, der an deine Nachrichten angefügt werden kann. Sie ist auf 300 Zeichen begrenzt.
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

print() kann das nicht, weil die print-Ausgabe ist immer in der Farbe, die das Konsolenfenster für Text vorsieht.

Du verwendest m. E. ein falsches Datenformat. Nutze eine Liste, der du die Werte beigibst, dann bestimmst du das größte Element und formatierst das und dann machst du aus der Liste einen String mittels "VERBINDUNGSELEMENT".join(LISTE), z. B. " ".join(liste), wodurch du dann deinen String bekommst. Beim Formatieren ist zu berücksichtigen, dass du das z. B. für die Ausgabe in einem HTML-Dokument o. ä. anpassen musst.

Mit den Werten 1:, 0:5 usw. kann ich nichts anfangen. Falls das Zeitangaben sind, wäre ein geeigneteres Dateiformat zu wählen, so dass das Auffinden des höchsten Wertes nicht eigens implementiert werden muss, sondern du dann max(LISTE) verwenden kannst.

Hilft Dir das?

Code: Alles auswählen

from random import randint

values = []

for i in range(10):
    values.append(randint(1, 20))

values.sort()

max_value = max(values)

output_values = ["**{}**".format(value) if value == max_value else str(value) for value in values]

print("Werte [1]:", values)

print("Werte [2]:", ", ".join(output_values))
TimeMen
User
Beiträge: 55
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Code: Alles auswählen

1: 0:1 1:10 2:4 3:4 4:8 5:31 6:5 7:1 8:12 9:14 10:0 11:1 12:3 13:3 14:19 15:4 16:3 17:0 18:11 19:16 20:8 21:9 22:0 23:3 24:1 25:0 
Das ist das Format.
Die erste Zahl steht für die Nummer der Operation (die danach folgen soll).
Wie man sieht folgen die nächsten Zahlen (die vor dem ":") einem Muster. (von 0-25), die Zahlen dahinter stellen eine Häufigkeit dar.
Und der höchste Wert dieser Häufigkeit soll eben irgendwie gekennzeichnet werden.

So wird der String aufgebaut:

Code: Alles auswählen

choice = str(i+1) + ": "
	for j in range(0, len(result[i])):
		if result[i][comp[j]] == x:
			choice = choice + str(comp[j]) + ":" + str(result[i][comp[j]]) + " "
		else:
			choice = choice + str(comp[j]) + ":" + str(result[i][comp[j]]) + " "
	os.system('clear')
	print(choice)
	info = str(i+1) + ". Rotation: "
	index = input(info)
Aber wenn sowas nicht geht dann mache ich es eben über irgendwelche Zeichen oder so.
Eine Signatur ist ein Text, der an deine Nachrichten angefügt werden kann. Sie ist auf 300 Zeichen begrenzt.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@TimeMen: Dein Index- und String-Gemetzel kann man kaum anschauen.

Code: Alles auswählen

    counts = result[i]
    choices = []
    for component in comp:
        c = counts[component]
        if c == x:
            choices.append("{}:{}**".format(component, c))
        else:
            choices.append("{}:{}".format(component, c))
    print("{}.: {}".format(i+1, " ".join(choices)))
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das in einem String zu sammeln macht die Sache trotzdem unnötig kompliziert...

Gibt es auch 2: 0:1 1:10 2:4 3:4 4:8 und 3: 0:1 1:10 2:4 3:4 4:8 usw? Dann würde sich eine Dict von Tupeln eher anbieten.

Ob die Farbe verwenden kannst oder nicht hängt vom Ausgabegerät ab - es gibt ja auch monochrome Terminals...Ansonsten kannst du - zumindest unter Linux - `print` ANSI-Sequenzen mitgeben, die die Farbe des Ausgabe ändern.

Gruß, noisefloor
TimeMen
User
Beiträge: 55
Registriert: Samstag 24. Dezember 2016, 10:25
Wohnort: Deutschland

Das war eine schnelle Lösung die bis dato funktioniert hat.
Da ich Linux nutze und das Skript nur mir dienen soll, langt eine einfache Lösung mit der Farbe.
Das snippet verstehe ich zwar, dennoch funktioniert es nicht so wirklich...
Genauer gesagt sind die Werte hinter dem ":" immer 0, was nicht stimmen kann.
Eine Signatur ist ein Text, der an deine Nachrichten angefügt werden kann. Sie ist auf 300 Zeichen begrenzt.
Antworten