Julia中按price排序命名元组列表及字典列表用findmin/findmax
问题解答
一、按"price"字段排序命名元组列表
注意:你写的初始代码并非命名元组数组,而是包含Pair元素的Tuple数组。正确的命名元组需使用不带引号的字段名,格式为(name="IBM", shares=100, price=91.2)。
正确的命名元组数组定义
portfolio = [ (name="IBM", shares=100, price=91.2), (name="AAPL", shares=50, price=643.22), (name="FB", shares=150, price=21.09), (name="HPQ", shares=35, price=31.75), (name="YHOO", shares=45, price=16.35), (name="ACME", shares=75, price=115.65) ]
按price字段排序的方法
方法1:用by参数指定排序依据
sorted_portfolio = sort(portfolio, by=x->x.price)
方法2:Julia 1.9+ 支持直接按字段名排序
sorted_portfolio = sort(portfolio, :price)
如果必须使用原Tuple+Pair结构(不推荐,访问效率低),可先转换为字典再提取价格:
sorted_portfolio = sort(portfolio, by=x->Dict(x)["price"])
二、对字典列表使用findmin和findmax函数
Base Julia的findmin/findmax不支持by关键字参数,这是你报错的直接原因。可通过以下两种方式实现需求:
方法1:用argmin/argmax获取索引后提取元素
# 找到价格最低的字典 min_idx = argmin(x->x["price"], portfolio) cheap = portfolio[min_idx] # 找到价格最高的字典 max_idx = argmax(x->x["price"], portfolio) expensive = portfolio[max_idx]
方法2:提取价格数组后匹配原元素
prices = [x["price"] for x in portfolio] min_price, min_idx = findmin(prices) cheap = portfolio[min_idx] max_price, max_idx = findmax(prices) expensive = portfolio[max_idx]
错误原因说明
findmin报错:Base Julia的findmin没有by参数,你传入的by=x->x["price"]属于未支持的关键字,触发MethodError。sort报错:你的初始“命名元组”实际是Tuple{Pair{String, String}, Pair{String, Int64}, Pair{String, Float64}}类型,Tuple仅支持整数索引(如x[3]),无法用字符串x["price"]访问,因此触发getindex方法不存在的错误。
内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

