2017-07-06 1 views
0

Ich habe eine Zeichenfolge mit Wörterbuch, ich möchte es in eine Liste konvertieren, aber nicht in der Lage, einzelnes Zitat zu entfernen, während das gleiche tun.Konvertieren Zeichenfolge des Wörterbuchs zu Liste mit der Entfernung von einfachen Anführungszeichen

Kann mir jemand helfen, herauszufinden, was hier fehlt?

>>> a = '{"src_ports": [7] , "dst_ports": [8]}' 

Was ich will, ist folgende:

[{"src_ports": [7] , "dst_ports": [8]}] 

Aber was ich bekommen ist folgende:

>>> a = [a] 
>>> a 
['{"src_ports": [7] , "dst_ports": [8]}'] 

Editiert: Mit ast, um von Wörterbuch-Elemente wird geändert, muss ich halte es intakt.

>>> import ast 
>>> b = [ast.literal_eval(a)] 
>>> b 
[{'dst_ports': [8], 'src_ports': [7]}] 
+0

'import json; [json.loads (a)] ' –

+0

Ist es möglich, ohne zusätzliche Module zu importieren? –

+0

Warum hast du 'a' ursprünglich als String, wenn du es nur nicht als String zeichnest, wenn du es in die Liste bringst? Warum machen Sie es nicht von Anfang an zum Wörterbuch? –

Antwort

3
  • Mit ast.literal_eval:

    >>> import ast 
    >>> [ast.literal_eval(a)] 
    [{'src_ports': [7], 'dst_ports': [8]}] 
    
  • Mit json.loads (und Konservierungs Reihenfolge):

    >>> import collections 
    >>> import json 
    >>> [json.loads(a, object_pairs_hook=collections.OrderedDict)] 
    [OrderedDict([('src_ports', [7]), ('dst_ports', [8])])] 
    

    Beachten Sie, dass ein OrderedDict ist immer noch ein Wörterbuch, so dass man seine Elemente die gleiche zugreifen wie du es normalerweise tun würdest.

+0

@wim, hast du meine 'eval' Antwort absichtlich gelöscht? –

+0

Ja, es war entweder das oder ein Downvote. Roll-Back, wenn Sie den Downvote bevorzugen. – wim

+0

@wim Nun, das ist nicht wichtig, aber das OP wollte eine Methode, die keine Importe beinhaltete. –

0

können Sie die ast.literal_eval() Funktion als für das eval() sicherer verwenden:

import ast 

a = '{"src_ports": [7] , "dst_ports": [8]}' 

b = [ast.literal_eval(a)] 
# [{'dst_ports': [8], 'src_ports': [7]}] 

UPDATE - Vorausgesetzt, Ihre Struktur gleich bleibt, können Sie die json Modul in Kombination mit collections.OrderedDict wenn Sie verwenden können, möchte die Ordnung bewahren. Beachten Sie, dass beide Python dict und JSON sind, in der Regel, ungeordnete Strukturen:

import json 
import collections 

a = '{"src_ports": [7] , "dst_ports": [8]}' 

b = json.loads(a, object_pairs_hook=collections.OrderedDict) 

Aber wenn Sie es drucken Sie es aus werden Sie so etwas wie OrderedDict([(u'src_ports', [7]), (u'dst_ports', [8])]) aber Ihre Bestellung zum Beispiel wird erhalten erhalten, wenn Sie später serialisieren oder durchschleifen.

+0

@ zwer, ich habe es versucht, es ändert die Reihenfolge der Wörterbuchelemente, gibt es trotzdem die gleiche Reihenfolge im Wörterbuch zu erhalten? –

+0

@Sweety Es gibt keine implizite Reihenfolge für Wörterbücher in Pythons unter 3.6. Wenn Sie möchten, empfehle ich Ihnen, 'collections.OrderedDict' zu verwenden, das die Reihenfolge beibehält. –

+0

@Sweety - Überprüfen Sie das Update. – zwer

Verwandte Themen