【问题标题】:Python List splitting, sorting by date, then joiningPython列表拆分,按日期排序,然后加入
【发布时间】:2015-04-08 08:59:05
【问题描述】:

好吧,我已经在这家店呆了好几个小时了,我认输并求你怜悯。

目标:我有多个文件(银行对账单下载),我想 合并、排序、删除重复项。

下载格式如下:

"08/04/2015","Balance","5,804.30","Current Balance for account 123S14"
"08/04/2015","Balance","5,804.30","Available Balance for account 123S14"
"02/03/2015","241.25","Transaction description","2,620.09"
"02/03/2015","-155.49","Transaction description","2,464.60"
"03/03/2015","82.00","Transaction description","2,546.60"
"03/03/2015","243.25","Transaction description","2,789.85"
"03/03/2015","-334.81","Transaction description","2,339.12"
"04/03/2015","-25.05","Transaction description","2,314.07"

除了完全不知道我在做什么之外,我的主要问题之一是数值包含逗号。我已经成功地编写了去掉这种“隐藏”逗号的代码,然后去掉引号,这样我就有了一个 CSV... 行。

所以我现在有这种格式的数据

['02/03/2015', ' \t ', '241.25\t ', ' \t ', 'Transaction Details\n', '02/03/2015', ' \t ', ' \t ', '-155.49\t ', 'Transaction Details\n', '03/03/2015', ' \t ', '82.00\t ', ' \t ', 'Transaction Details\n', '03/03/2015', ' \t ', '243.25\t ', ' \t ', 'Transaction Details\n', '02/03/2015', ' \t ', '241.25\t ', ' \t ', 'Transaction Details\n']

我相信这使它几乎准备好对第一个元素进行排序,但我认为它现在是一个长列表,而不是列表列表。

我研究了sorts,发现了lambda...函数,所以我开始实现

new_file_data = sorted(new_file_data, key=lambda item: item[0])

但元素 [0] 只是 BOL 处的 "。

我还注意到我需要指出日期可能不是正确的格式,这导致我产生了这种结构:

sorted(new_file_data, key=lambda d: datetime.strptime(d, '%d/%m/%Y'))

我大致了解了“地图”结构,但不知道如何组合,以便我可以仅引用元素 [0] 以及 如何 来引用它(按日期计算)

现在我在这里,希望有人能帮我克服这个障碍吗? 我认为我需要[有] 更好地拆分列表开始,所以每一行都是一个元素 - 我曾在某一时刻得到一个排序的结果,但所有的字段都聚集在一起,值(排序)然后是日期,然后是单词等

因此,如果有人可以就我失败的列表操作以及如何构建 sort-lambda 提供一些建议。

感谢那些有时间并知道如何回答此类入门查询的人。

【问题讨论】:

    标签: python list sorting lambda


    【解决方案1】:

    如果我理解正确,您想阅读 csv 的内容并按日期对其进行排序。

    鉴于data.csv的内容

    "08/04/2015","Balance","5,804.30","Current Balance for account 123S14"
    "08/04/2015","Balance","5,804.30","Available Balance for account 123S14"
    "02/03/2015","241.25","Transaction description","2,620.09"
    "02/03/2015","-155.49","Transaction description","2,464.60"
    "03/03/2015","82.00","Transaction description","2,546.60"
    "03/03/2015","243.25","Transaction description","2,789.85"
    "03/03/2015","-334.81","Transaction description","2,339.12"
    "04/03/2015","-25.05","Transaction description","2,314.07"
    

    我会使用csv-module 来读取数据。

    import csv
    with open('data.csv') as f:
        data = [row for row in csv.reader(f)]
    

    这给出了:

    >>> data
    [['08/04/2015', 'Balance', '5,804.30', 'Current Balance for account 123S14'],
     ['08/04/2015', 'Balance', '5,804.30', 'Available Balance for account 123S14'],
     ['02/03/2015', '241.25', 'Transaction description', '2,620.09'],
     ['02/03/2015', '-155.49', 'Transaction description', '2,464.60'],
     ['03/03/2015', '82.00', 'Transaction description', '2,546.60'],
     ['03/03/2015', '243.25', 'Transaction description', '2,789.85'],
     ['03/03/2015', '-334.81', 'Transaction description', '2,339.12'],
     ['04/03/2015', '-25.05', 'Transaction description', '2,314.07']]
    

    那么你可以使用datetime-module来提供一个key来进行排序。

    import datetime 
    sorted_data = sorted(data, key=lambda row: datetime.datetime.strptime(row[0], "%d/%m/%Y"))
    

    这给出了:

    >>> sorted_data
    [['02/03/2015', '241.25', 'Transaction description', '2,620.09'],
     ['02/03/2015', '-155.49', 'Transaction description', '2,464.60'],
     ['03/03/2015', '82.00', 'Transaction description', '2,546.60'],
     ['03/03/2015', '243.25', 'Transaction description', '2,789.85'],
     ['03/03/2015', '-334.81', 'Transaction description', '2,339.12'],
     ['04/03/2015', '-25.05', 'Transaction description', '2,314.07'],
     ['08/04/2015', 'Balance', '5,804.30', 'Current Balance for account 123S14'],
     ['08/04/2015', 'Balance', '5,804.30', 'Available Balance for account 123S14']]
    

    【讨论】:

    • 谢谢你,优雅,我已经掌握了一些技巧。我现在有动力熬夜,看看我还能做多少! 问候
    • 没问题。如果这是您所追求的,请接受答案。
    【解决方案2】:

    您可以定义自己的排序函数。

    混合这两个问题,你就会得到你想要的(或接近的东西):

    Custom Python list sorting

    Python date string to date object

    在您的排序函数中,将日期从字符串转换为日期时间并进行比较

    def cmp_items(a, b):
        datetime_a = datetime.datetime.strptime(a.[0], "%d/%m/%Y").date()
        datetime_b = datetime.datetime.strptime(a.[0], "%d/%m/%Y").date()
        if datetime_a > datetime_b:
            return 1
        elif datetime_a == datetime_b:
            return 0
        else:
            return -1
    

    然后,您只需使用它对列表进行排序

    new_file_data = new_file_data.sort(cmp_items)
    

    在那之后你仍然可能有一点问题,具有相同日期的元素将按类似随机的顺序排列。你可以改进比较功能来比较更多的东西来防止这种情况发生。

    顺便说一句,你没有去掉隐藏的逗号,看来你已经完全删除了最后一部分。

    【讨论】:

    • 谢谢。关于被剥离的逗号,我只是指出我之前实际上已经放了一些码,取得了一些进展。我不认为我应该用所有代码(现在 257 行)淹没人们。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    相关资源
    最近更新 更多