首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python :基于值打印唯一条目

Python :基于值打印唯一条目
EN

Stack Overflow用户
提问于 2022-04-12 10:30:43
回答 2查看 52关注 0票数 0

我正在制作一个脚本,从不同的服务中获取电影和节目。我需要一个功能,如果一个电影是可用的流媒体平台(例如,派拉蒙)在4k和高清,然后我只想显示4K的结果。但是,如果标题仅供购买,那么我想将其排除在结果之外。

代码语言:javascript
复制
resp = {
    # Fetches JSON response as dict from server 
    # which contains offers as a list of dictionaries
    "offers": [
        {
            "monetization_type": "flatrate",
            "package_short_name": "pmp",
            "presentation_type": "4k",
        },
        {
            "monetization_type": "flatrate",
            "package_short_name": "pmp",
            "presentation_type": "hd",
        },
        {
            "monetization_type": "flatrate",
            "package_short_name": "fxn",
            "presentation_type": "hd",
        },
        {
            "monetization_type": "buy",
            "package_short_name": "itu",
            "presentation_type": "4k",
        },
    ]
}
    
def get_Stream_info(obj, results=[]):
    try:
        if obj["offers"]:
            count = 0
            for i in range(len(obj["offers"])):
                srv = obj["offers"][i]["monetization_type"]
                qty = obj["offers"][i]["presentation_type"]
                pkg = obj["offers"][i]["package_short_name"]
                if srv == "flatrate" and qty in ["4k", "hd"]:
                    results.append(f"Stream [{i+1}]: US - {pkg} - {qty}")
                    count = 1
                else:
                    errstr = f"No streaming options available."
        if count == 0:
            results.append(errstr)
    except KeyError:
        results.append(f"Not available.")
    return "\n".join(results)


if __name__ == "__main__":
    print(get_Stream_info(resp))

结果:

代码语言:javascript
复制
Stream [1]: US - pmp - 4k # ParamountPlus
Stream [2]: US - pmp - hd # ParamountPlus
Stream [3]: US - fxn - hd # FoxNow

4K和HD可以在ParamountPlus上使用,但我只想打印4K。

最后,高清在所有其他地方,4K是不可用的。

EN

回答 2

Stack Overflow用户

发布于 2022-04-12 10:47:53

如果你创建了一本评价质量的词典,那该怎么办?如果以后有SD或其他格式的流,可能会很好。这样,您总是以最少的代码显示来自每个服务的最佳质量流:

代码语言:javascript
复制
qty_ratings = {
    '4k': 1,
    'hd': 2,
    'sd': 3
}

附加最高质量的流:

代码语言:javascript
复制
if monetize == 'flatrate':  
            # Check if there are more than one stream from the same service
            if len(qty) > 1:
                qty = min([qty_ratings[x] for x in qty])
            result.append(f"Stream {[i]}: US - {service} - {qty}")

    return "\n".join(result)
票数 0
EN

Stack Overflow用户

发布于 2022-04-12 11:08:58

就我个人而言,我会明确地对流进行排序,并不是因为它更有效率,而是因为它表明了我在做什么。

假设您的报价被定义为问题中的内容:

代码语言:javascript
复制
ranking = ("sd", "hd", "4k")

def get_best_stream(streams):
    return max(streams, key=lambda x: ranking.index(x["presentation_type"]))


get_best_stream(offers)

正如@Gustaf所指出的,这是向前兼容的。我使用的是元组而不是数据集,因为我们实际上只关心秩序(也许更明确的是枚举)。

如果您想从每个来源保留一个报价,我将明确地对此进行编码:

代码语言:javascript
复制
def get_streams(streams):
    sources = set(x["package_short_name"] for x in streams)
    return [
        get_best_stream(s for s in streams if s["package_short_name"] == source)
        for source in sources
    ]



get_streams(offers)

当然,如果您有数十亿的流,那么在源和提供之间建立映射会更有效,但是对于几十个迭代器来说,迭代器的成本是微不足道的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71841081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档