在python

时间:2018-05-01 06:33:57

标签: python sorting currency

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

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))

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

完整列表在这里。 排序之前= [(' 30-Apr-2018',' $ 0.14'),(' 30-Apr-2018',' $ 101.65&# 39;),(' 30-Apr-2018',' $ 1,534.77'),(' 29-Apr-2018',' - $ 37.78& #39;),(' 29-Apr-2018',' $ 6.31'),(' 29-Apr-2018',' - $ 4.76 '),(' 29-Apr-2018',' - $ 39.55'),(' 28-Apr-2018',' - $ 664.78'),(' 28-Apr-2018',' - $ 142.25'),(' 28-Apr-2018',&# 39; - $ 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& #39;,' - $ 2.09'),(' 24-Apr-2018',' - $ 27.27'),(' 24-Apr -2018',' - $ 9.96'),(' 24-Apr-2018',' - $ 110.00'),(' 23 -Apr-2018',' - $ 7.34'),(' 22-Apr-2018',' - $ 87.02'),(' ; 2018年4月22日',' - $ 5.41'),(' 22-Apr-2018',& #39; - $ 21.11'),(' 21-Apr-2018',' - $ 12.69'),(' 21-Apr-2018' ,' - $ 6.75'),(' 21-Apr-2018',' - $ 500.00'),(' 201-Apr-2018&# 39;,' - $ 15.67'),(' 20-Apr-2018',' - $ 41.74'),(' 20-Apr- 2018年' - $ 20.47'),(' 20-Apr-2018',' $ 31.60'),(' 19-Apr -2018',' - $ 7.34'),(' 19-Apr-2018',' - $ 2.09'),(' 19 -Apr-2018',' - $ 5.24'),(' 19-Apr-2018',' - $ 22.70'),(' ; 2018年4月18日',' - $ 7.34'),(' 17-Apr-2018',' - $ 7.34'),(& #39; 2018年4月17日',' - 4.99美元'),(' 17-Apr-2018',' - $ 7.34'), (' 2018年4月16日',' - $ 7.33'),(' 16-Apr-2018',' - $ 59.00' ),(' 2018年4月15日',' - $ 42.75'),(' 14-Apr-2018',' - $ 9.43&# 39;),(' 13-Apr-2018',' $ 1,545.79'),(' 12-Apr-2018',' - $ 7.34& #39;),(' 12-Apr-2018',' - $ 11.63'),(' 12-Apr-2018' ,' - $ 14.44'),(' 11-Apr-2018',' - $ 81.31'),(' 10-Apr-2018&# 39;,' - $ 79.74'),(' 10-Apr-2018',' - $ 7.34'),(' 10-Apr- 2018年' - #11.11'),(' 09-Apr-2018',' - $ 7.34'),(' 07- 2018年4月' - $ 72.42'),(' 06-Apr-2018',' - $ 3.01'),(' 2018年4月6日',' - $ 7.34'),(' 05-Apr-2018',' - $ 7.34'),(&# 39; 05-Apr-2018',' - $ 9.20'),(' 04-Apr-2018',' - $ 7.34'),( ' 03-Apr-2018',' - $ 7.34'),(' 03-Apr-2018',' - $ 460.00') ,(' 03-Apr-2018',' - $ 7.34'),(' 02-Apr-2018',' - $ 7.34' ;),(' 02-Apr-2018',' $ 289.04'),(' 01-Apr-2018',' - $ 6.30&# 39;),(' 01-Apr-2018',' - $ 7.50'),(' 01-Apr-2018',' - $ 13.28 &#39)]

排序后= [(' 30-Apr-2018',' $ 0.14'),(' 30-Apr-2018',' $ 1,534.77'),(' 19-Apr-2018',' $ 1,545.79'),(' 30-Apr-2018',' $ 101.65'),(' 02-Apr-2018',' $ 289.04'),(' 20-Apr-2018',' $ 31.60'),(' 29-Apr-2018',' $ 6.31'),(' 10-Apr-2018',' - $ 11.11'),(' 12-Apr-2018',' - $ 11.63'),(' 24-Apr-2018',&# 39; - $ 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'),(' 201-Apr-2018& #39;,' - $ 15.67'),(' 25-Apr-2018',' - $ 2.09'),(' 19-Apr -2018',' - $ 2.09'),(' 20-Apr-2018',' - $ 20.47'),(' 22 -Apr-2018',' - $ 21.11'),(' 19-Apr-2018',' - $ 22.70'),(' ; 2018年4月24日' - ' - $ 27.27'),(' 06-Apr-20 18',' - $ 3.01'),(' 29-Apr-2018',' - $ 37.78'),(' 29- 2018年4月' - 39.55美元'),(' 29-Apr-2018',' - $ 4.76'),(' 2018年4月17日',' - 4.99美元'),(' 20-Apr-2018',' - $ 41.74'),(&# 39; 2018年4月15日',' - $ 42.75'),(' 03-Apr-2018',' - $ 460.00'),( ' 19-Apr-2018' - $ 5.24'),(' 22-Apr-2018',' - $ 5.41') ,(' 2018年4月21日',' - $ 500.00'),(' 16-Apr-2018',' - $ 59.00' ;),(' 01-Apr-2018',' - $ 6.30'),(' 21-Apr-2018',' - $ 6.75& #39;),(' 28-Apr-2018',' - $ 664.78'),(' 16-Apr-2018',' - $ 7.33'),(' 27-Apr-2018',' - $ 7.34'),(' 27-Apr-2018',' ; - $ 7.34'),(' 26-Apr-2018',' - $ 7.34'),(' 25-Apr-2018',& #39; - $ 7.34'),(' 23-Apr-2018',' - $ 7.34'),(' 19-Apr-2018' ,' - $ 7.34'),(' 18-Apr-2018',' - $ 7.34'),(' 17-Apr-20 18',' - $ 7.34'),(' 17-Apr-2018',' - $ 7.34'),(' 12- 2018年4月' - $ 7.34'),(' 10-Apr-2018',' - $ 7.34'),(' 2018年4月9日',' - $ 7.34'),(' 06-Apr-2018',' - $ 7.34'),(&# 39; 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& #39;),(' 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',& #39; - $ 9.96&#39)]

2 个答案:

答案 0 :(得分:0)

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

  1. 删除所有","
  2. 检查号码是否为负数(以"-"开头)
  3. 转换为float
  4. 的数字
  5. 转换为int
  6. 您可以使用以下代码:

    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]
    

    你得到的结果可以通过以下事实来解释:在对字符串进行排序时,你要逐字逐句地进行,"-" > "$"所以所有负数都在最后并按字典顺序排序。

答案 1 :(得分:0)

使用列表理解进行格式化/转换:

items = [(date, float("".join(c for c in price if c!='$' and c!=','))) for date, price in items]

然后按预期排序......