求教怎么能比较优雅的实现这个功能 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
warcraft1236
V2EX    Python

求教怎么能比较优雅的实现这个功能

  •  
  •   warcraft1236 2019-04-29 18:50:05 +08:00 5997 次点击
    这是一个创建于 2364 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一段 json,格式大概是这样的

    "data":[ { "file": "https://fvs.io/re.........", "label": "480p", "type": "mp4" }, { "file": "https://fvs.io/redirector.......", "label": "720p", "type": "mp4" } ] 

    我想取出来 label 中清晰度最高的

    37 条回复    2019-04-30 12:23:17 +08:00
    ErnieSauce
        1
    ErnieSauce  
       2019-04-29 18:57:35 +08:00
    我一般使用 json 转数组,然后提取
    ErnieSauce
        2
    ErnieSauce  
       2019-04-29 18:58:56 +08:00
    @ErnieSauce 刚看到是在 python 区,这个不太清楚,应该也有类似的吧
    hmxxmh
        3
    hmxxmh  
       2019-04-29 19:15:42 +08:00 via Android
    遍历取出字段 label 的值和对应的索引,比较大小留下大的索引,然后通过索引去取字典
    entertainyou
        4
    entertainyou  
       2019-04-29 19:32:16 +08:00
    max(list, key=lambda x: x['label']) // 需要根据需求修改 key 函数.
    Leigg
        5
    Leigg  
       2019-04-29 21:28:40 +08:00 via iPhone   1
    @hmxxmh 遍历的时候就已经得到结果了,兄弟
    warcraft1236
        6
    warcraft1236  
    OP
       2019-04-29 21:53:29 +08:00
    @Leigg 遍历的时候得不到吧,毕竟不知道后边是不是还有更大的值
    zzxCNCZ
        7
    zzxCNCZ  
       2019-04-29 21:55:46 +08:00
    遍历一遍就能去取到最大的啦
    awah
        8
    awah  
       2019-04-29 22:09:34 +08:00
    如果是 python sorted 可以自定义排序吧
    Northxw
        9
    Northxw  
       2019-04-29 22:23:27 +08:00
    首先,这种 Json 格式一般来说是固定且有序的(不排除某些奇葩站点,不过我没遇见过),获取 -1 索引位置的就好;
    然后,如果接口每次返回随机个数的 label,但是固定顺序的,len(data) 后获取 [-1] 个就好;
    最后,如果随机个数且无序,建议用正则;第一次匹配数字,确定最大的,第二次在第一期确定基础之上,非贪婪正则匹配最近的 label。
    zzz686970
        10
    zzz686970  
       2019-04-29 22:47:54 +08:00
    @entertainyou 如果还有 1080p 那岂不是拿不到么?
    linweibin
        11
    linweibin  
       2019-04-29 23:06:56 +08:00
    不知道楼主要什么语言,思路:冒泡排序取/div>
    zqx
        12
    zqx  
       2019-04-29 23:28:04 +08:00 via Android
    js:
    arr.sort((a,b)=>{
    return Number(a.label)-Number(b.label)
    })[0]
    hundan
        13
    hundan  
       2019-04-29 23:36:18 +08:00 via Android
    一边遍历一边按标签重新分组 然后最后操作不同分组
    LancerComet
        14
    LancerComet  
       2019-04-29 23:37:07 +08:00
    [
    {
    "file": "https://fvs.io/re.........",
    "label": "480p",
    "type": "mp4"
    },
    {
    "file": "https://fvs.io/redirector.......",
    "label": "720p",
    "type": "mp4"
    },
    {
    "file": "https://fvs.io/redirector.......",
    "label": "240p",
    "type": "mp4"
    },
    {
    "file": "https://fvs.io/redirector.......",
    "label": "1080p",
    "type": "mp4"
    },
    ].reduce((prev, value) => parseInt(value.label) > parseInt(prev.label) ? value : prev)
    icy37785
        15
    icy37785  
       2019-04-30 00:44:50 +08:00
    遍历一遍呀。
    prolic
        16
    prolic  
       2019-04-30 01:15:46 +08:00
    print(reduce(lambda x,y: x if x['label'] > y['label'] else y,json.loads(str).get('data')))
    懒得格式化了,凑合看吧
    vHypnos
        17
    vHypnos  
       2019-04-30 02:59:19 +08:00
    sort 排序 ( by lable ) 然后返回最后一个 ( or 第一个)
    Trim21
        18
    Trim21  
       2019-04-30 03:14:27 +08:00 via Android
    max(o['data'], key=lambda x:int(x['label'][:-1]))
    aliao0019
        19
    aliao0019  
       2019-04-30 03:23:33 +08:00 via Android
    遍历啊,为什么要去排序
    hmxxmh
        20
    hmxxmh  
       2019-04-30 08:00:53 +08:00 via Android
    @linweibin 我也觉得有点类似冒泡排序
    Foreverdxa
        21
    Foreverdxa  
       2019-04-30 08:32:39 +08:00
    js 里的 reduce 可以实现,前面老哥都是很详细了。。。
    zqx
        22
    zqx  
       2019-04-30 08:56:54 +08:00 via Android
    js:
    Math.max(arr.map((item)=>{return item.label}))
    WuwuGin
        23
    WuwuGin  
       2019-04-30 09:00:49 +08:00
    啥排序啊,就取个最大值而已
    nacosboy
        24
    nacosboy  
       2019-04-30 09:21:05 +08:00
    maxResolution := 0

    for _, d := range data {
    if maxResolution < parseXXX(d.Label) {
    maxResolution = parseXXX(d.Label)
    }
    }

    return maxResolution
    nacosboy
        25
    nacosboy  
       2019-04-30 09:22:38 +08:00
    ```go
    func main() {
    maxResolution := 0

    for _, d := range data {
    if maxResolution < parseXXX(d.Label) {
    maxResolution = parseXXX(d.Label)
    }
    }

    print(maxResolution)
    }

    ```
    zblongfei
        26
    zblongfei  
       2019-04-30 09:28:05 +08:00 via iPhone
    遍历一边就能拿到手非常简单
    daguaochengtang
        27
    daguaochengtang  
       2019-04-30 09:32:59 +08:00
    @zqx 你这个表达式返回的是 NaN。 第一,Math.max 不能接收数组。第二,label 是字符串,要转成数字
    Math.max(...arr.map(item => parseInt(item.label)))
    Chenamy2017
        28
    Chenamy2017  
       2019-04-30 10:01:17 +08:00
    遍历
    取每个 label,转数字,比较大小;如果大的这个对象就暂存
    一遍下来就能拿到暂存的最大的对象了。
    45HXlKzal6W56zUJ
        29
    45HXlKzal6W56zUJ  
       2019-04-30 10:03:12 +08:00
    你们都忽略了 在比较的时候 1080P < 480P 的问题..
    fzzff
        30
    fzzff  
       2019-04-30 10:05:10 +08:00
    data = [
    {
    "file": "https://fvs.io/re.........",
    "label": "480p",
    "type": "mp4"
    },
    {
    "file": "https://fvs.io/redirector.......",
    "label": "1020p",
    "type": "mp4"
    },
    {
    "file": "https://fvs.io/redirector.......",
    "label": "720p",
    "type": "mp4"
    }
    ]

    data.sort(key=lambda d:int(d['label'][:-1]), reverse=True)
    print(data[0])
    45HXlKzal6W56zUJ
        31
    45HXlKzal6W56zUJ  
       2019-04-30 10:05:26 +08:00
    sorted(a, key=lambda x:int(x['label'][:-1]), reverse=True)

    第一个就是
    inhzus
        32
    inhzus  
       2019-04-30 10:08:21 +08:00
    max(json.dumps(d)['data'], key=lambda x: int(x['label'][:-1]))
    zqx
        33
    zqx  
       2019-04-30 10:34:13 +08:00
    @nikolausliu 手机上打的,疏忽了。parseInt 可以将字符串中数字部分提取出来,而 Number 只能构造数值,最后应该用...展开数组给 max 函数
    Akichu
        34
    Akichu  
       2019-04-30 10:53:12 +08:00
    用 js 的 ramda 库:
    R.last(R.sortBy(R.prop('label'), data))
    ccdrea
        35
    ccdrea  
       2019-04-30 10:54:30 +08:00
    1.
    max(data, key=lambda x: int(x['label'].replace('p','')))

    2.
    data.sort(key=lambda x:int(x['label'].replace('p','')))
    data[-1]
    ccdrea
        36
    ccdrea  
       2019-04-30 11:19:47 +08:00
    补充:
    from collections import OrderedDict

    c = list(map(lambda x:OrderedDict(x),a))[-1]

    # OrderedDict 实现一个 FIFO 得 dict
    TommyLemon
        37
    TommyLemon  
       2019-04-30 12:23:17 +08:00
    能用 SQL 过滤最好,不能用就遍历再对比
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2287 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 01:05 PVG 09:05 LAX 18:05 JFK 21:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86