Python:比较嵌套值-更简洁的方法

Python:比较嵌套值-更简洁的方法,python,performance,for-in-loop,Python,Performance,For In Loop,我是python新手,知道有更好的方法来完成这个极其简单的任务,但我似乎没有提出正确的问题,我希望这里的人能给我一些关于如何整理我的代码的建议-我觉得我正在编写大量代码来完成我正在做的事情 我正在用tvdb_api标记我录制的电视节目。api以有趣的结构(dict嵌套元组嵌套dict)返回横幅。基本结构为: {"684x400": {"949520": {"_bannerpath": "http://tvdb.com/banners/somepath",

我是python新手,知道有更好的方法来完成这个极其简单的任务,但我似乎没有提出正确的问题,我希望这里的人能给我一些关于如何整理我的代码的建议-我觉得我正在编写大量代码来完成我正在做的事情

我正在用tvdb_api标记我录制的电视节目。api以有趣的结构(dict嵌套元组嵌套dict)返回横幅。基本结构为:

{"684x400":
    {"949520":
        {"_bannerpath": "http://tvdb.com/banners/somepath",
         "rating" : 9.000
         #etc...
        },
     "456520":
        {"_bannerpath": "http://tvdb.com/banners/somepath",
            "rating" : 9.000
            #and so on...
        }
    }
}
我在数据结构中的项目上循环,比较
评级
值,并获得评级最高的横幅的
\u bannerpath
。我通过从结构中获取所有
评级
\u bannerpath
值,并将它们作为嵌套列表复制到一个列表中,然后将评级值分离到另一个列表中,并使用max获得最高值并返回相应的bannerpath

一定有比这更好的方法

posterList = []

for tup in bannerStructure:
            for key in tup[1]:
                    if key == "rating":
                            posterList.append([tup[1]['rating'],tup[1]['_bannerpath']])
        ratingList = []

        for rating in posterList:
            ratingList.append(rating[0])

        maxRating = max(ratingList)

        for lst in posterList:
            if lst[0] == maxRating:
                return lst[1]

谢谢你的帮助

您可以使用comprehension和
max
函数来获取此信息

max([(k["_bannerpath"], k["rating"]) for v in data.values() for k in v.values()], key=lambda x:x[1])

假设实际结构如下所示:

{"684x400":
    {"949520":
        {"_bannerpath": "http://tvdb.com/banners/somepath",
         "rating" : 9.000
         #etc...
        },
     "456520":
        {"_bannerpath": "http://tvdb.com/banners/somepath",
         "rating" : 9.000
         #and so on...
        }
    }
}
然后,要查找每个分辨率具有最高评级的横幅:

from operator import itemgetter

for resolution, banners in tvdb_api_result.items():
    bannerpath = max(banners.values(), key=itemgetter('rating'))['_bannerpath']
    print("%s %s" % (resolution, bannerpath))

是否要为每个
nxm
分辨率获取具有最高
评级的
\u bannerpath
?您可以[a]使用
排序的
按评级排序,或[b]在循环中保持max运行。您发布的示例数据不是有效的python数据结构。@AshwiniChaudhary向J.F.Sebastian道歉,他是正确的+1我也将用这种方法进行实验。。。Python文档不适合我的大脑不幸的是。。。您是否打算简要解释lambda@leemo:确保
评级
在输入中确实是浮动的,否则比较将不正确,例如
“2”>“10”
。您可以使用:
key=lambda b:float(b['rating'])
对其进行解析以获得
2<10