2016-04-01 23 views
0

Lassen Sie uns sagen, dass ich so etwas wie dieses:generieren String aus einem Wörterbuch

counts = {"chuck" : 1 , "annie" : 42, "jan" : 100} 
lst = list(counts.keys()) 
lst.sort() 
for key in lst: 
    print(key, counts[key]) 

Der Ausgang

chuck 1 
annie 42 
jan 100 

wäre, wenn ich diesen Effekt mit einer Schnur erreichen wollte, würde die Zeichenfolge dargestellt werden als

"chuck 1\nannie 42\njan 100\n" 

Nun, wenn ich diese Zeichenfolge erreichen wollte ich so etwas wie versuchen könnte:

for key, value in counts.items(): 
    if value == 1: 
     counts[key] = "1\n" 
    elif value == 42: 
     counts[key] = "42\n" 
    elif value == 100: 
     counts[key] = "100\n" 

temp = list(counts.items()) 
temp.sort() 
myStr = str(temp) 

for char in myStr: 
    if char in "[(',)]": 
     myStr = myStr.replace(char,'') 

finalStr = "" + myStr[0:19] + "" + myStr[20:37] + "" + myStr[38:53] + "" 

Aber yeah, ich denke, ich bin überkompliziert Dinge ... Was wäre ein besserer und einfacher Weg?

Danke!

+1

Können Sie versuchen zu erklären, was Sie in der menschlichen Sprache suchen, so müssen wir nicht als Python-Interpreter handeln, um Ihre Frage zu verstehen? – arekolek

+0

Ich möchte die obige Zeichenfolge generieren. – Riggs

+0

Möchten Sie nach Schlüssel oder nach Wert sortieren? Die anfängliche Schleife zeigt Ihnen die Sortierung nach Schlüssel, aber die Ausgabe, die Sie anzeigen, wird stattdessen nach Wert sortiert. – Blckknght

Antwort

-1
d = {"chuck" : 1 , "annie" : 42, "jan" : 100}; 
s = '\n'.join(['%s %s' % (key, value) for (key, value) in sorted(d.items(), key=lambda x: x[1])]) 
print(s) # 'chuck 1\nannie 42\njan 100' 

d = {"chuck" : 1 , "annie" : 42, "jan" : 100}; 
s = '\n'.join(['%s %s' % (key, value) for (key, value) in sorted(d.items(), key=lambda x: x[0])]) 
print(s) # 'annie 42\nchuck 1\njan 100' 
+0

Ich mag diesen hier wirklich. Danke @Maciej A. Czyzewski – Riggs

+0

@idjaw Frage lesen + Kommentare unter Frage. –

+0

@ MaciejA.Czyzewski Wie habe ich das nicht gesehen! :) OK. Vielen Dank! (Btw. Ich habe Sie nicht downvote ...) – idjaw

2

Sie können dies erreichen, indem jeder key, value als String Formatierung Sie erwarten pro "{} {}".format(key, value)

Dann kommen Sie auf '\ n':

"\n".join(["{} {}".format(key, value) for key, value in counts.items()]) 

Demo:

Eingang:

counts = {"chuck" : 1 , "annie" : 42, "jan" : 100} 

Ausgabe:

jan 100 
chuck 1 
annie 42 

Bemerkt, dass sorted eine Voraussetzung war, so ist es hier mit einer Art ist:

"\n".join(["{} {}".format(key, value) for key, value in sorted(counts.items())]) 

Ausgang:

annie 42 
chuck 1 
jan 100 
+0

Großartige Köpfe denken ähnlich ... mit ungefähr der gleichen Geschwindigkeit. :) Ich glaube, dass es effizienter ist, ein Listenverständnis mit '.join()' als einem Generatorausdruck zu verwenden. – zondo

+0

haha ​​wow.Wirklich war die gleiche Zeit. Interessant. Ist das wirklich? – idjaw

+0

Bisher wird fast jede Antwort, die einen Generatorausdruck verwendet, kommentiert. Von dem, was ich gelesen habe, liegt es daran, dass '.join()' wissen muss, wie viel Speicher zuzuweisen ist, also konvertiert es den Generator trotzdem in eine Liste. Natürlich wäre es effizienter, den Generatorteil zu überspringen und direkt zur Liste zu gehen. – zondo

0

Es ist ein bisschen klobig:

'\n'.join(["{0} {1}".format(a,b) for a,b in counts.items()]) 
0

Wenn Sie prägnant sind.

d = {"chuck" : 1 , "annie" : 42, "jan" : 100} 

'\n'.join('{} {}'.format(*item) for item in sorted(d.items())) 
1

Concise mit Sortierung:

>>> '\n'.join(sorted([k+' '+str(v) for k, v in counts.items())]) 
'annie 42\nchuck 1\njan 100' 

Linien anstelle von Artikel Sortierung. Es ist tatsächlich schneller so wie von %timeit gemessen.

Verwandte Themen