首页 > 解决方案 > 在 python 中排序值对,其中一对是美元格式

问题描述

所以我有一个这样的清单。

items = [('30-Apr-2018', '$0.14'), ('30-Apr-2018', '$1,534.77'), ('29-Apr-2018', '-$7.34')]

我尝试使用这两个命令对其进行排序,我认为它们执行相同的排序

items = sorted(items, key=lambda x: x[1])
items = sorted(items,key=itemgetter(1))

但他们总是出现问题。看起来好像完成了一些排序?但由于某种原因不正确,我怀疑这是由于列表对中第二个元素的格式。关于如何排序的任何建议?我看到的唯一选择是将美元值转换为十进制,然后尝试再次排序,并可能将美元符号加回去,但也许其他人会有更好的解决方案。

完整列表在这里。排序前 = [('2018 年 4 月 30 日','0.14 美元'),('2018 年 4 月 30 日','101.65 美元'),('2018 年 4 月 30 日','1,534.77 美元'),('29- 2018 年 4 月', '-$37.78'), ('2018 年 4 月 29 日', '6.31 美元'), ('2018 年 4 月 29 日', '-$4.76'), ('2018 年 4 月 29 日', ' -$39.55'), ('2018 年 4 月 28 日', '-$664.78'), ('2018 年 4 月 28 日', '-$142.25'), ('2018 年 4 月 28 日', '-$9.12'), ('27-Apr-2018', '-$7.34'), ('27-Apr-2018', '-$7.34'), ('26-Apr-2018', '-$7.34'), ('26-Apr -2018', '-$13.23'), ('25-Apr-2018', '-$7.34'), ('25-Apr-2018', '-$2.09'), ('24-Apr-2018', ' -$27.27'),('2018 年 4 月 24 日','-$9.96'),('2018 年 4 月 24 日','-$110。

排序后 = [('2018 年 4 月 30 日','0.14 美元'),('2018 年 4 月 30 日','1534.77 美元'),('2018 年 4 月 13 日','1545.79 美元'),('30- 2018 年 4 月','101.65 美元'),('2018 年 4 月 2 日','289.04 美元'),('2018 年 4 月 20 日','31.60 美元'),('2018 年 4 月 29 日','6.31 美元' ), ('10-Apr-2018', '-$11.11'), ('12-Apr-2018', '-$11.63'), ('24-Apr-2018', '-$110.00'), ('21 -Apr-2018', '-$12.69'), ('26-Apr-2018', '-$13.23'), ('01-Apr-2018', '-$13.28'), ('12-Apr-2018' , '-$14.44'), ('28-Apr-2018', '-$142.25'), ('21-Apr-2018', '-$15.67'), ('25-Apr-2018', '-$2.09' ), ('2018 年 4 月 19 日', '-$2.09'), ('2018 年 4 月 20 日', '-$20.47'), ('2018 年 4 月 22 日','-$21.11'),('2018 年 4 月 19 日','-$22.70'),('2018 年 4 月 24 日','-$27.27'),('2018 年 4 月 6 日', '-$3.01'), ('2018 年 4 月 29 日', '-$37.78'), ('2018 年 4 月 29 日', '-$39.55'), ('2018 年 4 月 29 日', '-$4.76 '), ('2018 年 4 月 17 日', '-$4.99'), ('2018 年 4 月 20 日', '-$41.74'), ('2018 年 4 月 15 日', '-$42.75'), (' 2018 年 4 月 3 日', '-$460.00'), ('2018 年 4 月 19 日', '-$5.24'), ('2018 年 4 月 22 日', '-$5.41'), ('2018 年 4 月 21 日', '-$500.00'), ('16-Apr-2018', '-$59.00'), ('01-Apr-2018', '-$6.30'), ('21-Apr-2018', '-$6.75 '), ('2018 年 4 月 28 日', '-$664.78'), ('2018 年 4 月 16 日', '-$7.33'), ('2018 年 4 月 27 日', '-$7.34'), ('2018 年 4 月 27 日', '-$7.34'), ('2018 年 4 月 26 日', '-$7.34'), ('2018 年 4 月 25 日', '-$7.34'), ( '2018 年 4 月 23 日', '-$7.34'), ('19-Apr-2018', '-$7.34'), ('18-Apr-2018', '-$7.34'), ('17-Apr- 2018', '-$7.34'), ('17-Apr-2018', '-$7.34'), ('12-Apr-2018', '-$7.34'), ('10-Apr-2018', '- $7.34'), ('09-Apr-2018', '-$7.34'), ('06-Apr-2018', '-$7.34'), ('05-Apr-2018', '-$7.34'), ( '04-Apr-2018', '-$7.34'), ('03-Apr-2018', '-$7.34'), ('03-Apr-2018', '-$7.34'), ('02-Apr- 2018', '-$7.34'), ('01-Apr-2018', '-$7.50'), ('07-Apr-2018', '-$72.42'), ('10-Apr-2018', '-$79.74'), ('11-Apr-2018', '-$81.31'), ('22-Apr-2018', '-$87.02'), ('28-Apr-2018', '-$9.12'), ('05-Apr-2018', '-$9.20'), ('14-Apr-2018', '-$9.43'), ('24-Apr-2018', '-$9.96')]

标签: pythonsortingcurrency

解决方案


为了对您的价格进行排序,您首先需要将它们转换为数字格式(浮点数或整数)。因此,要转换您的字符串,您需要以下步骤:

  1. 删除所有","
  2. 检查数字是否为负数(以 开头"-"
  3. 转换为数字float
  4. 转换成int

您可以使用以下代码:

def convert(string):
    string = string.replace(",","")
    num_val = 0.0
    if string[0]=="-":
        num_val = -float(string[2:])
    else:
        num_val = float(string[1:])
    # If you want integer value in cents
    # return int(round(num_val*100.0))
    return num_value

items = [(d, convert(p)) for (d,p) in items]

您得到的结果可以通过以下事实来解释:在对字符串进行排序时,您逐个字符地进行排序,"-" > "$"因此所有负数都在末尾并按字典顺序排序。


推荐阅读