转到列表中的嵌套字典

时间:2013-08-14 11:20:08

标签: python list dictionary

我很难找到列表中的嵌套字典。

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的方法来实现相同的结果。

达雷尔。

2 个答案:

答案 0 :(得分:1)

使用列表理解:

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

现在你有一个包含这两个键的字典列表。

演示:

>>> 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)

此处first将设置为带有两个键的第一个字典,或者None(如果没有这样的字典)。

如果这样的语法有点令人生畏,那么这是一个带有for循环的版本:

first = None
for d in L:
    if 'firstname' in d and 'lastname' in d:
        first = d
        break

答案 1 :(得分: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'}

相关问题