代码之家  ›  专栏  ›  技术社区  ›  A Beautiful Trend

按“日期”对Python字典进行排序以保持字典的完整性[重复]

  •  0
  • A Beautiful Trend  · 技术社区  · 2 周前

    在网上做了一些研究后,似乎没有任何简单的方法可以订购一本词典

    My Dict包含一个列表,每个名称都是关键字

    dummy_data = {
        "Date":["01/24/2029","10/28/2027", "01/24/2024","03/24/2024"],
        "Company Name":["Mcdonalds", "Burger King", "KFC","Popeyes"],
        "File_name_location":["C/Documents/Files/invoice1.pdf", "C/Documents/Files/invoice1.pdf","C/Documents/Files/invoice1.pdf"],
    }
    

    正如你在上面看到的,我有一个名为“日期”的字段,它以随机顺序列出日期。我想尽量少约会,但也要确保“公司名称”也能移动

    根据一些信息,我必须将日期更改为日期时间,我是通过

    for index, result in enumerate(dummy_data["Date"]):
        dummy_data["Date"][index] = datetime.strptime(dummy_data["Date"][index], "%m/%d/%Y").date()
    

    我知道有一种更快的方法可以用lambda很快地将Date更改为日期,但我对lambda还不够熟悉。

    在任何情况下,另一个问题是,如果可能的话,我也希望用斜杠保留我的日期,但这似乎甚至不可能,因为.date()以这种格式返回它**(01-24-2029)**,但我现在必须将日期时间包装在str中,否则日期列表中会有日期时间的对象,而不是字符串数据。

    我的最终目标是

    1. 按日期排序,并确保“公司名称”也保留了上述内容的正确索引
    2. 如果可能的话,用斜线保持日期。如果不可能,那就不用担心了。

    我知道有一个OrderedDict类,但我不熟悉它,因为我相信它使用了某种函数,比如lambda作为参数。

    • 如果重要的话为什么 我之所以想按日期排序,是因为这些日期是由一些发票提取的,我正在使用PDFREADER读取日期,然后我最终将PDF合并在一起,但它将按文件的日期合并,这意味着具有“最短”日期的文件将根据我的需要放在顶部或底部。无论如何,如果有人觉得他们有某种变通办法,请回复我。

    无论出于什么原因,我都尝试过

    sorted_val = str(sorted(dummy_data["Date"]))
    

    我仔细检查了上面的内容,但它实际上没有分类

    1 回复  |  直到 2 周前
        1
  •  1
  •   Chris    2 周前

    平行列表往往会引起混淆。如果这是一个字典列表而不是一个列表字典,那就容易多了。

    dummy_data = [
        {
            "Date": "01/24/2029",
            "Company Name": "Mcdonalds"
        },
        {
            "Date": "10/28/2027",
            "Company Name": "Burger King"
        },
        {
            "Date": "01/24/2024",
            "Company Name": "KFC"
        },
        {
            "Date": "03/24/2024",
            "Company Name": "Popeyes"
        }
    ]
    

    所以现在我们可以简单地使用 str.split 排序。

    sorted(
        dummy_data, 
        key=lambda x: ((y := [int(z) for z in x['Date'].split('/')])[2], y[0], y[1])
    )
    

    我们得到:

    [{'Date': '01/24/2024', 'Company Name': 'KFC'}, 
     {'Date': '03/24/2024', 'Company Name': 'Popeyes'}, 
     {'Date': '10/28/2027', 'Company Name': 'Burger King'}, 
     {'Date': '01/24/2029', 'Company Name': 'Mcdonalds'}]
    

    你只需要弄清楚如何从你的数据结构转移到这个结构。这应该非常简单明了。

    分解lambda

    [int(z) for z in x['Date'].split('/')]
    

    这是一个列表理解。我们在上拆分了日期字符串 '/' 但是每个东西都是一个字符串,所以我们得到它的int版本 '10/03/2023' 例如,我们现在有一个列表 [10, 3, 2023] .

    然后,我们使用“walrus运算符”将列表理解分配给 y 同时还返回该列表。我们可以写:

    ([int(z) for z in x['Date'].split('/')][2], [int(z) for z in x['Date'].split('/')][0], [int(z) for z in x['Date'].split('/')][1])
    

    但这两者都做了太多的工作,而且看起来很烦人。海象接线员的意思是我们只需要打电话 str.split 一旦

    然后,我们构建第三个元素(在索引2处,因为Pyth0on列表为零索引)、第一个元素和第二个元素的元组。这表示年、月、日期。

    以此为关键字,我们先按年份、月份、日期对词典进行排序。