代码之家  ›  专栏  ›  技术社区  ›  Thomas

在python中排序值对,其中一对为美元格式

  •  1
  • Thomas  · 技术社区  · 7 年前

    所以我有一个这样的列表。

    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日','1534.77美元'),('2018年4月29日','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美元',('2018年4月27日','7.34美元',('2018年4月27日','7.34美元',('2018年4月26日','7.34美元'),('2018年4月26日','-13.23美元',('2018年4月25日','-7.34美元',('2018年4月25日','-2.09美元',('2018年4月24日','-27.27美元',('2018年4月24日','-9.96美元',('2018年4月24日','-110.00美元'),('2018年4月23日','-7.34美元',('2018年4月22日','-87.02美元',('2018年4月22日',','-5美元.41“,('2018年4月22日','-21.11美元',('2018年4月21日','-12.69美元',('2018年4月21日','-6.75美元',('2018年4月21日','-500.00美元',('2018年4月21日','-15.67美元'),('2018年4月20日','41.74美元','2018年4月20日','20.47美元','2018年4月20日','31.60美元','2018年4月19日','7.34美元','2018年4月19日','2.09美元','2018年4月19日','5.24美元','2018年4月19日','22.70美元','2018年4月18日','7.34美元','2018年4月17日','7.34美元34“,('2018年4月17日','-4.99美元',('2018年4月17日','-7.34美元',('2018年4月16日','-7.33美元',('2018年4月16日','-59.00美元',('2018年4月15日','-42.75美元'),('2018年4月14日','9.43美元','2018年4月13日','1545.79美元','2018年4月12日','7.34美元','2018年4月12日','11.63美元','2018年4月12日','14.44美元','2018年4月11日','81.31美元','2018年4月10日','79.74美元','2018年4月10日','7.34美元','2018年4月10日','11日.11“,('2018年4月9日','-7.34美元',('2018年4月7日','-72.42美元',('2018年4月6日','-3.01美元',('2018年4月6日','-7.34美元',('2018年4月5日','-7.34美元'),('2018年4月5日','-9.20美元',('2018年4月4日','-7.34美元',('2018年4月3日','-7.34美元',('2018年4月3日','-460.00美元',('2018年4月3日','-7.34美元',('2018年4月2日','-7.34美元'),('2018年4月2日','289.04美元',('2018年4月1日','-6.30美元',('2018年4月1日','7.50“,('2018年4月1日','-$13.28“)]

    排序后=[('2018年4月30日','0.14美元'),('2018年4月30日','1534.77美元'),('2018年4月13日','1545.79美元'),('2018年4月30日','101.65美元'),('2018年4月2日','289.04美元',('2018年4月20日','31.60美元',('2018年4月29日','6.31美元'),('2018年4月10日','11.11美元'),('2018年4月12日','11美元.63“,('2018年4月24日','-110.00美元',('2018年4月21日','-12.69美元',('2018年4月26日','-13.23美元',('2018年4月1日','-13.28美元'),('2018年4月12日','-14.44美元',('2018年4月28日','-142.25美元',('2018年4月21日','-15.67美元',('2018年4月25日','-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美元','2018年4月16日','59.00美元','2018年4月1日','6.30美元','2018年4月21日','500.00美元'。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美元',('2018年4月19日','-7.34美元',('2018年4月18日','-7.34美元',('2018年4月17日','-7.34美元'),('2018年4月12日','-7.34美元',('2018年4月10日','-7.34美元',('2018年4月9日','-7.34美元.34“,('2018年4月6日','-7.34美元',('2018年4月5日','-7.34美元',('2018年4月4日','-7.34美元',('2018年4月3日','-7.34美元',('2018年4月3日','-7.34美元'),('2018年4月2日','-7.34美元',('2018年4月1日','-7.50美元',('2018年4月7日','-72.42美元',('2018年4月10日','-79.74美元',('2018年4月11日','-81.31美元',('2018年4月22日','-87.02美元',('2018年4月28日','-9.12美元','2018年4月5日','-9.20美元',('2018年4月14日','-9美元.43“,('2018年4月24日','-$9.96“)]

    2 回复  |  直到 7 年前
        1
  •  0
  •   Eolmar    7 年前

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

    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]
    

    您得到的结果可以解释为这样一个事实,即在对字符串进行排序时,您可以逐个字符进行排序,然后 "-" > "$" 所以所有的负数都在末尾,并按字典顺序排序。

        2
  •  0
  •   Julien    7 年前

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

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

    然后按预期排序。。。