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

使用列表推导:

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
于 2013-08-14T11:21:17.683 回答
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 回答