2016-07-12 12 views
0

Ich versuche, durch ein Wörterbuch zu iterieren und Zeilenumbrüche zu entfernen, und habe Schwierigkeiten mit der Analyse der Elemente.Wie wiederhole ich ein Diktat, während ich gleichzeitig Zeilenvorschubzeichen lösche?

sagen, wir haben

line_contents = {"user_id": "6GrH6gp09pqYykGv86D6Dg", "text": "Decent selection of more than just bar food. \n\nJumbo fish sandwich is aptly named. \n\nSeem to be generous with the pour.", "business_id": "fNGIbpazjTRdXgwRY_NIXA", "likes": 0, "date": "2013-04-22", "type": "tip"} 

#I've tried: 
line_contents=dict(map(strip(),x) for x in line_contents.items()) 
#but^doesn't work. I can't figure out how the map function or the dictionary comprehension works 

#I eventually want: 
line_contents = {"user_id": "6GrH6gp09pqYykGv86D6Dg", "text": "Decent selection of more than just bar food. Jumbo fish sandwich is aptly named. Seem to be generous with the pour.", "business_id": "fNGIbpazjTRdXgwRY_NIXA", "likes": 0, "date": "2013-04-22", "type": "tip"} 

Ich bin durch die Wörterbuch-Elemente mit einer typischen for Schleife zu durchlaufen versucht, aber möchte dict Verständnis versuchen, wie ich sie nie haben.

Antwort

4

Eigentlich verwenden Sie kein Wörterbuch Verständnis. Das ist ein Funktionsaufruf mit einem einzigen Argument: einem Generatorausdruck. Ein Wörterbuch Verständnis wäre wie folgt aus:

line_contents = {key: value.replace("\n", "") for key, value in line_contents.items()} 

bearbeiten: niemmi machte einen guten Punkt, dass die Werte nicht alle Saiten. Daher sollten Sie etwas ähnliches zu seinem Vorschlag verwenden:

line_contents = {k: v.replace("\n", "") if isinstance(v, basestring) else v for k,v in line_contents.items()} 

I verwendet basestring statt niemmi der str, weil sie tatsächlich Unicode sind. In Python 3 sollten Sie str verwenden.

Was war los mit deiner? Nun, Sie geben dict ein Argument. Betrachten Sie dies:

argument = [] 
for x in line_contents.items(): 
    argument.append(map(strip(), x)) 

line_contents = dict(argument) 

Das ist ziemlich viel, was Sie tun. Für jedes Schlüssel/Wert-Paar geben Sie map() zwei Argumente strip() und x. Für einen Anruf von map(strip(), x), Sie sind in der Tat tun dies:

function = strip() 
result = [] 
for item in x: 
    result.append(function(item)) 

Jetzt müssen Sie das Problem sehen. Zum einen ist strip nicht definiert. Zum anderen sollen Sie map mit einer Funktion versorgen, nicht was die Funktion zurückgibt. Wenn Sie verwenden str.strip wollten, tun Sie es wie folgt aus:

map(str.strip, x) 

Das Problem dabei ist, dass str.strip() Streifen von den Enden; Es entfernt nicht die neuen Linien, die in der Mitte erscheinen.

+0

Seltsam, das scheint nicht zu funktionieren. Wenn ich eine Druckzeile von 'print line_contents' in die Wörterbuchzeile unmittelbar vor der Wörterbuchverfassungszeile einfüge, zeigt sie, was ich für rohe Zeichenfolgen halte:' {u'user_id ': u'6GrH6gp09pqYykGv86D6Dg', u'text ': u' Anständige Auswahl an mehr als nur Bar Essen. \ n \ nJumbo Fischsandwich ist treffend benannt. \ n \ nScheinen Sie großzügig mit dem Pour. ", u'business_id ': u'fNGIbpazjTRdXgwRY_NIXA', u'likes ': 0, u'date': u'2013-04-22 ', u'type': u 'tip'} 'Sollte das irgendwelche Auswirkungen auf das haben, was ich hier versuche? – simplycoding

+0

Hat es einen Fehler? Ändert es einige Dinge, aber nicht alle? Das "U" bedeutet Unicode, nicht roh. Wenn es sich um rohe Saiten handelte, würde das einen Unterschied machen, aber eigentlich ist eine rohe Saite nichts anderes als eine normale Saite. "Raw" bezieht sich darauf, wie es erstellt wird, nicht was es wird. – zondo

+0

Kein Fehler, das '\ n' erscheint immer noch im Wörterbuch, wenn ich es erneut drucke. – simplycoding

3

können Sie dict Verständnis verwenden, aber da einige Ihrer Werte werden Sie keine Strings haben, dass zu berücksichtigen:

line_contents = {k: v.replace('\n', '') if isinstance(v, str) else v for k, v in line_contents.items()} 

Falls beide Schlüssel und Werte Newline enthalten Sie dict builtin verwenden können:

line_contents = dict([y.replace('\n', '') if isinstance(y, str) else y for y in x] 
        for x in line_contents.items()) 

natürlich dict Verständnis würde immer noch funktionieren, aber es aussehen würde ziemlich chaotisch:

line_contents = {k: v for k, v in 
       ([y.replace('\n', '') if isinstance(y, str) else y for y in x] 
        for x in line_contents.items()) 
       } 
+0

Stellt sich heraus, dass das Wörterbuch 'line_contents' in Unicode ist. So kommt es als 'line_contents = {u'user_id ': u'6GrH6gp09pqYykGv86D6Dg', u'text ': u'Decent Auswahl von mehr als nur Bar Essen. \ n \ nJumbo Fischsandwich ist treffend benannt. \ n \ nScheinen Sie großzügig mit dem Pour. ", u'business_id ': u'fNGIbpazjTRdXgwRY_NIXA', u'likes ': 0, u'date': u'2013-04-22 ', u'type': u 'Tipp'} '. Ihr Vorschlag hat offensichtlich funktioniert, wenn es nicht Unicode war. Irgendeine Idee, wie man das macht? – simplycoding

Verwandte Themen