2014-03-07 9 views
7

Wie iterieren Sie über ein Wörterbuch nach Wörterbuch Verständnis, um es zu verarbeiten.Iterate über ein Wörterbuch durch Verständnis und erhalten Sie ein Wörterbuch

>>> mime_types={ 
    '.xbm': 'image/x-xbitmap', 
    '.dwg': 'image/vnd.dwg', 
    '.fst': 'image/vnd.fst', 
    '.tif': 'image/tiff', 
    '.gif': 'image/gif', 
    '.ras': 'image/x-cmu-raster', 
    '.pic': 'image/x-pict', 
    '.fh': 'image/x-freehand', 
    '.djvu':'image/vnd.djvu', 
    '.ppm': 'image/x-portable-pixmap', 
    '.fh4': 'image/x-freehand', 
    '.cgm': 'image/cgm', 
    '.xwd': 'image/x-xwindowdump', 
    '.g3': 'image/g3fax', 
    '.png': 'image/png', 
    '.npx': 'image/vnd.net-fpx', 
    '.rlc': 'image/vnd.fujixerox.edmics-rlc', 
    '.svgz':'image/svg+xml', 
    '.mmr': 'image/vnd.fujixerox.edmics-mmr', 
    '.psd': 'image/vnd.adobe.photoshop', 
    '.oti': 'application/vnd.oasis.opendocument.image-template', 
    '.tiff':'image/tiff', 
    '.wbmp':'image/vnd.wap.wbmp' 
} 

>>> {(key,val) for key, val in mime_types.items() if "image/tiff" == val} 

Dies ist Ergebnis so Rückkehr:

set([('.tiff', 'image/tiff'), ('.tif', 'image/tiff')]) 

Aber ich bin

('.tif', 'image/tiff') 

erwarten, wie ich das Ergebnis ändern können, wie ein Wörterbuch zu erhalten:

{'.tif': 'image/tiff'} 

Antwort

2

Der Ausdruck:

{ value for bar in iterable } 

ist ein set comprehension.

Um dict Verständnis zu tun, müssen Sie durch : getrennt Python mit einer Reihe von Schlüssel-Wert-Paaren zur Verfügung zu stellen:

{ key: value for bar in iterable } 
12

Ersetzen

{(key,val) for key, val in mime_types.items() if "image/tiff" == val} 

mit

{key: val for key, val in mime_types.items() if "image/tiff" == val} 
3

können Sie tun dictionary comprehension als @Anubhav Chattoraj vorgeschlagen.

oder ein generator expr als Argument übergeben dict funktionieren:

In [165]: dict((k, mimes[k]) for k in mimes if mimes[k] == "image/tiff") 
Out[165]: {'.tif': 'image/tiff', '.tiff': 'image/tiff'} 

nicht die beiden Wege nach oben mischen Sie ..

+0

Es wäre besser gewesen, wenn Sie die '.items vermieden() ' – thefourtheye

+0

@ thefourtheye warum? erhalten Sie nicht 'ValueError: zu viele Werte zum Auspacken'? – zhangxaochen

+0

'dict ((k, mimes [k]) für k in mimes wenn mimes [k] == image/tiff") 'Du meidest die von' .items() ' – thefourtheye

1
you can try something like this 

>>> print {k : v for k, v in mime_types.iteritems()} 

Another Simple Example 

    >>> print {i : chr(65+i) for i in range(4)} 
    {0 : 'A', 1 : 'B', 2 : 'C', 3 : 'D'}