【问题标题】:keeping certain dates from list of dictionaries保留字典列表中的某些日期
【发布时间】:2019-12-31 00:11:39
【问题描述】:
listOfdicts =  [{'end': 352, 'id': 'T2', 'start': 342, 'text': '3/4/1920', 'type': 'DATE'},
 {'end': 687, 'id': 'T3', 'start': 679, 'text': '1/1/1909', 'type': 'DATE'},
 {'end': 710, 'id': 'T11', 'start': 702, 'text': '5/1/2000', 'type': 'DATE'}]

如上所示,我有一个字典列表。 (这是一个样本。我的真实数据是~700K)。如果'type':DATE 小于日期1950,我的目标是只保留'text': somedate

我想要的最终输出是日期在1950下的 dics 列表

[{'end': 352, 'id': 'T2', 'start': 342, 'text': '3/4/1920', 'type': 'DATE'}, {'end': 687, 'id': 'T3', 'start': 679, 'text': '1/1/1909', 'type': 'DATE'}]

我试过下面的代码

older_age =[]

for l in listOfdicts:
    if l['type'] == 'DATE':
        if l['text'] <= 1950:
            older_age.append(l)

但这并不完全有效。如何更改我的代码,以便只保留1950 下的日期?

【问题讨论】:

  • 请指定是否要保留非日期字段。或者只保留日期

标签: python-3.x string list loops dictionary


【解决方案1】:

你可以试试这段代码……

import datetime

listOfdicts =  [{'end': 352, 'id': 'T2', 'start': 342, 'text': '3/4/1920', 'type': 'DATE'},
 {'end': 687, 'id': 'T3', 'start': 679, 'text': '1/1/1909', 'type': 'DATE'},
 {'end': 710, 'id': 'T11', 'start': 702, 'text': '5/1/2000', 'type': 'DATE'}]

older_age = [old for old in listOfdicts if datetime.datetime.strptime(old['text'],"%m/%d/%Y") < datetime.datetime.strptime("1950", "%Y")]

输出将是:

[{'end': 352, 'id': 'T2', 'start': 342, 'text': '3/4/1920', 'type': 'DATE'},
 {'end': 687, 'id': 'T3', 'start': 679, 'text': '1/1/1909', 'type': 'DATE'}]

【讨论】:

    【解决方案2】:

    您可以使用过滤器,并拆分您的日期字符串并首先获取年份,然后与 1950 进行比较:

    older_age = list(filter(lambda x : x['type'] != 'DATE' or int(x['text'].split('/')[-1]) <= 1950, listOfdicts))
    
    print(older_age)
    

    输出:

    [
     {'end': 352, 'id': 'T2', 'start': 342, 'text': '3/4/1920', 'type': 'DATE'},
     {'end': 687, 'id': 'T3', 'start': 679, 'text': '1/1/1909', 'type': 'DATE'}
    ]
    

    --或者正如@Jean-FrançoisFabre 所建议的,您可以使用列表推导:

    older_age = [d for d in listOfdicts if d["type"] != "DATE" or int(d["text"].split("/")[-1]) <= 1950]
    

    【讨论】:

    • 一个 listcomp 比 filter + lambda: filtered = [d for d in listOfdicts if d["type"]!="DATE" or int(d["text"].split("/")[-1])&lt;1950] 更好
    【解决方案3】:

    尝试int(l["text"][-4:]) 而不是l["text"],只取最后 4 位数字(年份)并将它们转换为整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2021-10-05
      • 1970-01-01
      相关资源
      最近更新 更多