0

リスト内のネストされた辞書にたどり着くのに苦労しています。

L = [{'color':'yellow','fruit':'banana'},{'firstname':'Jack','lastname':'Black'}]

次のコードで個々の辞書を取得できます。

for a in L:
   print (a)

{'color': 'yellow', 'fruit': 'banana'}
{'lastname': 'Black', 'firstname': 'Jack'}

しかし、今は姓/名の辞書だけが必要です。

私の質問にヒントが投稿された後、次のコードを思いつきました。

def getPhotosFromAlbum(albumName):
    availablePhotos = []
    availableAlbums = getAlbumList()
    print("Looking in album %s" %albumName)
    for album in availableAlbums:
        if albumName == album['AlbumName']:
            #print ("found photos for album: ", albumName['KeyList'])
            for photoRefKey in album['KeyList']:
                print(getPhotoPath(photoRefKey))
                availablePhotos.append(getPhotoPath(photoRefKey))
    return availablePhotos 

この関数の背後にある考え方は、HTML テンプレート ファイルのリストを解析して写真を表示できるようにすることです。したがって、私のフォローアップの質問は次のとおりです。このコードは大丈夫ですか、それとも同じ結果を達成するためのよりPythonのようなアプローチがありますか。

ダレル。

4

2 に答える 2

1

私は解決策を提案するためにMartijnの答えに基づいています:

  • あなたの例のように(リストではなく)アイテムのプリントを返します
  • キーが正確'lastname'かつ'firstname'(含まれているだけでなく)であることを確認する

スクリプトはヘルパーを使用して、あるリストが別のリストのサブリストであるかどうかを非常に簡単にチェックします

L = [{'color':'yellow','fruit':'banana'},{'firstname':'Jack','lastname':'Black'}]

def contains_sublist(lst, sublst):
    for k in sublst:
        if k not in lst:
            return False
    return True

for di in L:
    if len(di.keys()) == 2 and contains_sublist(di.keys(),
                                                       ['firstname','lastname']):
        print di

戻り値

>>> 
{'lastname': 'Black', 'firstname': 'Jack'}

////////// 編集 -- Martijn に感謝

.viewkeys()効率アップに使えます

L = [{'color':'yellow','fruit':'banana'},{'firstname':'Jack','lastname':'Black'}]

for di in L:
    if len(di) == 2 and di.viewkeys() & {'firstname','lastname'}:
        print di

これは、両方のセット間の交差が空でないかどうかをチェックしますdi.viewkeys() & {'firstname','lastname'}

于 2013-08-14T12:00:31.467 に答える
1

リスト内包表記を使用します。

only_last_and_first = [d for d in L if 'firstname' in d and 'lastname' in d]

これで、これら 2 つのキーを持つ辞書のリストができました。

デモ:

>>> L = [{'color':'yellow','fruit':'banana'},{'firstname':'Jack','lastname':'Black'}]
>>> [d for d in L if 'firstname' in d and 'lastname' in d]
[{'lastname': 'Black', 'firstname': 'Jack'}]

最初のそのような辞書だけが必要な場合はnext()、ジェネレーター式を使用します。

first = next((d for d in L if 'firstname' in d and 'lastname' in d), None)

first2 つのキーを持つ最初のディクショナリに設定されるか、そのNoneようなディクショナリがない場合は、ここに設定されます。

そのような構文が少し難しい場合は、for代わりにループを使用したバージョンを次に示します。

first = None
for d in L:
    if 'firstname' in d and 'lastname' in d:
        first = d
        break
于 2013-08-14T11:21:17.683 に答える