在Python中过滤字典列表

1 投票
2 回答
8140 浏览
提问于 2025-04-18 14:49

我需要创建一个过滤器,基本上是处理以下信息...

dictlist = [{'ext': 'mp4',
                 'height': 480,
                 'id', 'pies'},
                {'ext': 'webm',
                 'height': 360,
                 'id', 'pies2'},
                {'ext': 'mp4',
                 'height': 360,
                 'id', 'charles1'},
                {'ext': 'mp4',
                 'height': 720,
                 'id', 'tucker'}]

(还有更多内容,但这里简化了)

然后输出一个元素的ID,这个元素必须是mp4格式(或者我想要的其他格式),并且它的高度在某个值以下,并且是最高的。

举个例子,我想建立一个类似于...

def getmestuff(listofdics, extrequired, heightmax):
    /*do the work*/
    return id;

所以,比如说使用上面的数据...

getmestuff(dictlist, 'mp4', 720)

会返回... pies

2 个回答

0

这是一个用来做相同事情的函数:

def get_me_stuff(dict_l, val, max_h):
    best = 0
    id = None
    for d in dict_l:
        h = d.get('height')
        if d.get("ext") == val and max_h > h > best:
            best = h
            id = d.get("id")
    return id
6

这样做怎么样:

mp4s = (d for d in dictlist if d['ext'] == 'mp4')
max(mp4s, key=lambda x: x['height'])

这个代码会返回一个叫“max”的字典——从这个字典中获取 id 就很简单了。(而且你可以把 mp4s 直接写在一行里,但为了让大家更清楚,我把它分成了两行。)


虽然读起来稍微复杂一点,但更简洁:

max(dictlist, key=lambda d: (d['ext'] == 'mp4', d['height']))

第一个版本会很贴心地在列表里没有 mp4 时抛出一个 ValueError 错误,而第二个版本在这种情况下只会返回高度最大的那个东西。

撰写回答