如何筛选元组列表中首元素为'test'的项并提取次元素指定值?
高效提取元组列表中的指定值
刚好碰到过类似的场景,我来给你捋捋怎么一步到位解决这个问题!
首先明确你的场景:你有这样一个元组列表:
conditions = [('test', {'key': 'testval1' }), ('test', {'key': 'testval2' }), ('test', {'key': 'testval3' }), ('test', {'key': 'testval4' }), ('foo', {'key': 'testval5' }), ('oof', {'key': 'testval6' }), ('qux', {'key': 'testval7' }), ('qux', {'key': 'testval8' })]
你想要筛选出所有首元素是'test'的项,然后提取这些项里字典的'key'对应值,最终得到['testval1','testval2','testval3','testval4']。现在你用filter拿到了目标元组列表,但不想再单独循环一次来提取值。
这里有两种很实用的方法,都能一步搞定:
方法一:列表推导式(最推荐,简洁直观)
直接在列表推导里同时完成筛选和提取操作,一行代码就能出结果:
result = [item[1]['key'] for item in conditions if item[0] == 'test']
简单解释下:我们遍历conditions里的每一项item,先判断它的第一个元素是不是'test',如果符合条件,就直接取出第二个元素(也就是那个字典)里'key'对应的值,最终直接生成你想要的列表。
方法二:结合filter和map(如果你习惯用函数式写法)
如果你更倾向于用filter这种函数式的写法,可以搭配map来完成提取,不用额外加循环:
# 拆分写更清晰 filtered_tuples = filter(lambda x: x[0] == 'test', conditions) result = list(map(lambda x: x[1]['key'], filtered_tuples)) # 也可以合并成一行 result = list(map(lambda x: x[1]['key'], filter(lambda x: x[0] == 'test', conditions)))
这里先通过filter筛选出所有首元素为'test'的元组,再用map把每个元组转换成对应的key值,最后转成列表就搞定了。
另外提个小细节:你之前写的filter(lambda x:'test' in x, conditions)其实有点小风险——'test' in x会检查元组里的任意元素是否包含'test'字符串,如果哪天你的字典里刚好有个值是'test',就可能会误匹配。换成x[0] == 'test'会更精准,完全符合你的需求。
内容的提问来源于stack exchange,提问作者pikk
相关产品推荐
相关产品推荐

