首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用两个小数点对str价格进行Python排序

用两个小数点对str价格进行Python排序
EN

Stack Overflow用户
提问于 2016-08-08 23:23:49
回答 4查看 1.1K关注 0票数 0

我的目标:首先根据价格,然后按名称对产品的list (dict)进行排序。我的问题是:包含数字的Str值没有正确排序(AKA“人工排序”或“自然排序”)。

我从一个类似的问题中找到了这个函数:Python sorting list of dictionaries by multiple keys

代码语言:javascript
复制
def multikeysort(items, columns):
    from operator import itemgetter
    comparers = [((itemgetter(col[1:].strip()), -1) if col.startswith('-') else
                  (itemgetter(col.strip()), 1)) for col in columns]
    def comparer(left, right):
        for fn, mult in comparers:
            result = cmp(fn(left), fn(right))
            if result:
                return mult * result
        else:
            return 0
    return sorted(items, cmp=comparer)

问题是我的价格是str型的,如下所示:

代码语言:javascript
复制
products = [
    {'name': 'Product 200', 'price': '3000.00'},
    {'name': 'Product 4', 'price': '100.10'},
    {'name': 'Product 15', 'price': '20.00'},
    {'name': 'Product 1', 'price': '5.05'},
    {'name': 'Product 2', 'price': '4.99'},
]

所以它们是按字母顺序排列的,像这样:

代码语言:javascript
复制
'100.10'
'20.10'
'3000.00'
'4.99'
'5.05'

类似地,当我按名字排序时,我得到以下信息:

代码语言:javascript
复制
'Product 1'
'Product 15'
'Product 2'
'Product 200'
'Product 4'

姓名应按“人”顺序列出(1,2,15,而不是1,15,2)。能解决这个问题吗?我对蟒蛇很陌生,所以我可能错过了一些重要的东西。谢谢。

编辑

更多信息:我将产品列表发送到Django模板,该模板要求正确格式化数字。如果我浮动价格,然后不浮动他们,我必须重复两次的产品列表,这似乎是过火。

EN

回答 4

Stack Overflow用户

发布于 2016-08-08 23:32:29

你的排序函数太过分了。试试这个简单的方法:

代码语言:javascript
复制
from pprint import pprint

products = [
    {'name': 'Product 200', 'price': '3000.00'},
    {'name': 'Product 4', 'price': '100.10'},
    {'name': 'Product 15', 'price': '20.00'},
    {'name': 'Product 1', 'price': '5.05'},
    {'name': 'Product 2', 'price': '4.99'},
]

sorted_products = sorted(products, key=lambda x: (float(x['price']), x['name']))
pprint(sorted_products)

结果:

代码语言:javascript
复制
[{'name': 'Product 2', 'price': '4.99'},
 {'name': 'Product 1', 'price': '5.05'},
 {'name': 'Product 15', 'price': '20.00'},
 {'name': 'Product 4', 'price': '100.10'},
 {'name': 'Product 200', 'price': '3000.00'}]

我的解决方案的本质是让key函数返回排序条件的元组。元组总是按字典顺序进行比较,所以第一项是主要排序,第二项是次要排序,依此类推。

票数 3
EN

Stack Overflow用户

发布于 2016-08-08 23:31:08

我认为你最好的选择是把价格解析为浮动(这样你就可以对价格进行排序):

代码语言:javascript
复制
float("1.00")
# output: 1.0

然后用两个小数位输出它们:

代码语言:javascript
复制
"{:.2f}".format(1.0)
# output: "1.00"
票数 2
EN

Stack Overflow用户

发布于 2016-08-08 23:31:27

尝试将它们输入到问题中浮动,当您需要打印2位小数位时,您可以轻松地将输出格式化如下:

代码语言:javascript
复制
float_num = float("110.10")
print "{0:.2f}".format(float_num) # prints 110.10
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38839892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档