如何修改Python函数筛选标记为1的对应最低价格元组项
问题描述
我写了这段代码:
from typing import List, Tuple def cheapest_shark(prices: List, sharks: List ) -> Tuple: shp = zip(sharks, prices) sharkprices = tuple(shp) print(sharkprices)
输入是:
cheapest_shark([230, 180, 52, 390, 520], [1, 0, 0, 1, 1])
现在输出的元组里每个元素是(标记, 价格)的形式,但我需要每个元素为**(价格, 标记)**,且返回标记为1的项中价格最低的那个(本示例应返回(230, 1))。我试过把元组转成字典,循环筛选标记为1的项再取最低价,但没成功,求可行的实现方案。
解决方案
方法一:先筛选再取最小值
核心逻辑是先调整zip的顺序生成你要的(价格, 标记)元组,再筛选出标记为1的项,最后用min()直接取价格最低的项(min默认会按元组第一个元素排序):
from typing import List, Tuple def cheapest_shark(prices: List[int], sharks: List[int]) -> Tuple[int, int]: # 调整zip顺序,生成(价格, 标记)格式的元组 shark_price_pairs = zip(prices, sharks) # 筛选出标记为1的项 valid_items = [pair for pair in shark_price_pairs if pair[1] == 1] # 返回价格最低的项 return min(valid_items) # 测试 print(cheapest_shark([230, 180, 52, 390, 520], [1, 0, 0, 1, 1])) # 输出(230, 1)
方法二:用min()的key参数直接筛选(更简洁)
不用提前生成筛选列表,直接在min()里通过key参数先排除标记不为1的项,再按价格排序:
from typing import List, Tuple def cheapest_shark(prices: List[int], sharks: List[int]) -> Tuple[int, int]: return min( zip(prices, sharks), # 优先排除标记不为1的项(给这类项设更高的排序权重),再按价格从小到大排序 key=lambda x: (x[1] != 1, x[0]) ) # 测试 print(cheapest_shark([230, 180, 52, 390, 520], [1, 0, 0, 1, 1])) # 输出(230, 1)
为啥转字典会失败?
字典的键是唯一的,如果有多个相同标记的项,转字典会直接覆盖之前的条目;而且字典的结构不适合这种“筛选+取最小”的场景,用列表推导或直接调用min()是更适配的方案。
内容的提问来源于stack exchange,提问作者moon knight
相关产品推荐
相关产品推荐

