我有一个接受参数的html表单,然后是一个python应用程序(flask),它在返回结果之前对json文件进行排序。除了少数几个条目的价格不是数字而是字符串(特别是“调用价格”)外,这一切都很好
sortparam=request.form["inputsearch"]
if sortparam == 'Location':
keyparam = lambda s: s['Location']
elif sortparam == 'Price':
keyparam = lambda s: int(s['Price'].replace(',', ''))
elif sortparam == 'Size':
keyparam = lambda s: s['Size']
with open("output/boatlist.json", "r") as jdata:
data = json.load(jdata)
data['boats'].sort(key=keyparam)
以下是json的一个示例:
"boats": [
{
"Name": "Lagoon 46",
"Price": "Call For Price",
"Size": "46 ft / 2020",
"Location": "Vancouver, British Columbia, Canada"
},
{
"Name": "Lagoon 42",
"Price": "790,000",
"Size": "42 ft / 2021",
"Location": "Vancouver, British Columbia, Canada"
},
{
"Name": "Leopard 40",
"Price": "560,000",
"Size": "40 ft / 2016",
"Location": "Victoria, British Columbia, Canada"
}
]
此时,我已经解决了这个问题,在构建json时,我只是将所有“callforpricing”替换为“0”,但我想知道是否有一种优雅的方式将它们排序到列表的末尾
您只需扩展keyparam函数,添加一个“调用价格”的案例,如下所示:
在这里使用0,因为这是您在问题中提到的。但是,如果希望它位于列表的末尾,可以使用
float('inf')
:这是否优雅值得怀疑,但它解决了问题,而不必直接修改数据
Edit:我更新了这个选项,在字符串上使用
.lower()
,以防字符串的大小写不总是大写在构建JSON时将字段设置为0可能是最有效的方法,但可以说不是最优雅和明确的方法
您可以定义一个用作键的函数,如下所示:
或者,如果您想继续使用lambdas:
或者,如果您知道只有一个值不是数字:
相关问题 更多 >
编程相关推荐