当存在字符串时,对数字列表进行排序

2024-09-27 21:27:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个接受参数的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”,但我想知道是否有一种优雅的方式将它们排序到列表的末尾


Tags: lambdanamejsonsize排序价格locationprice
2条回答

您只需扩展keyparam函数,添加一个“调用价格”的案例,如下所示:

keyparam = lambda s: 0 if s['Price'].lower() == "call for price" else int(s['Price'].replace(',', ''))

在这里使用0,因为这是您在问题中提到的。但是,如果希望它位于列表的末尾,可以使用float('inf')

keyparam = lambda s: float('inf') if s['Price'].lower() == "call for price" else int(s['Price'].replace(',', ''))

这是否优雅值得怀疑,但它解决了问题,而不必直接修改数据

Edit:我更新了这个选项,在字符串上使用.lower(),以防字符串的大小写不总是大写

在构建JSON时将字段设置为0可能是最有效的方法,但可以说不是最优雅和明确的方法

您可以定义一个用作键的函数,如下所示:

...
elif sortparam == 'Price':
    def keyparam (s):
        text = s['Price'].replace(',', '')
        try:
            return int(text)
        except ValueError as e:
            return 0
...

或者,如果您想继续使用lambdas:

elif sortparam == 'Price':
    keyparams = lambda s: int(s['Price'].replace(',', '')) if s['Price'].replace(',', '').replace('-', '').isdigit() else 0

或者,如果您知道只有一个值不是数字:

elif sortparam == 'Price':
    keyparams = lambda s: 0 if s['Price'] == 'Call for Price' else int(s['Price'].replace(',', '')) 

相关问题 更多 >

    热门问题