求教怎么能比较优雅的实现这个功能 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
daiqiangbudainiu

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

  •  
  •   daiqiangbudainiu Apr 29, 2019 6363 views
    This topic created in 2558 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    return maxResolution
    nacosboy
        25
    nacosboy  
       Apr 30, 2019
    ```go
    func main() {
    maxResolution := 0

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

    print(maxResolution)
    }

    ```
    klongfei
        26
    klongfei  
       Apr 30, 2019 via iPhone
    遍历一边就能拿到手非常简单
    daguaochengtang
        27
    daguaochengtang  
       Apr 30, 2019
    @zqx 你这个表达式返回的是 NaN。 第一,Math.max 不能接收数组。第二,label 是字符串,要转成数字
    Math.max(...arr.map(item => parseInt(item.label)))
    Chenamy2017
        28
    Chenamy2017  
       Apr 30, 2019
    遍历
    取每个 label,转数字,比较大小;如果大的这个对象就暂存
    一遍下来就能拿到暂存的最大的对象了。
    45HXlKzal6W56zUJ
        29
    45HXlKzal6W56zUJ  
       Apr 30, 2019
    你们都忽略了 在比较的时候 1080P < 480P 的问题..
    fzzff
        30
    fzzff  
       Apr 30, 2019
    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  
       Apr 30, 2019
    sorted(a, key=lambda x:int(x['label'][:-1]), reverse=True)

    第一个就是
    inhzus
        32
    inhzus  
       Apr 30, 2019
    max(json.dumps(d)['data'], key=lambda x: int(x['label'][:-1]))
    zqx
        33
    zqx  
       Apr 30, 2019
    @nikolausliu 手机上打的,疏忽了。parseInt 可以将字符串中数字部分提取出来,而 Number 只能构造数值,最后应该用...展开数组给 max 函数
    Akichu
        34
    Akichu  
       Apr 30, 2019
    用 js 的 ramda 库:
    R.last(R.sortBy(R.prop('label'), data))
    ccdrea
        35
    ccdrea  
       Apr 30, 2019
    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  
       Apr 30, 2019
    补充:
    from collections import OrderedDict

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

    # OrderedDict 实现一个 FIFO 得 dict
    TommyLemon
        37
    TommyLemon  
       Apr 30, 2019
    能用 SQL 过滤最好,不能用就遍历再对比
    About     Help     Advertise     Blog     API     FAQ     Solana     2697 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 126ms UTC 02:42 PVG 10:42 LAX 19:42 JFK 22:42
    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