【问题标题】:Order dates inside a string from a list从列表中对字符串中的日期进行排序
【发布时间】:2017-08-28 12:37:20
【问题描述】:

我有这样的列表列表,我给你示例输入:

thislist= [[1, 'Aug 2014, Sept 2016, Ian 2014, Feb 2016', 2], [5,'Aug 2015, Sept 2012, Ian 2015, Aug 2017',4]]

我有兴趣为每个列表(带有日期的列表)只在 index[1] 处工作,我想要的输出将是这样的:

thislist= [[1, 'Ian, Aug 2014; Feb, Sept 2016', 2], [5,'Sept 2012; Ian, Aug 2015; Aug 2017',4]]

(以上只是一个例子,在我的实际情况下,我会有更多的日期和年份,但格式完全相同) 基本上,我想根据日历的实际顺序(例如:Ian、Feb、Mar、Apr 等)订购每个日期名称的缩写(它们是罗马尼亚语,但它们在英语中是完全相同的),并将它们分组为按年代顺序排列的年份示例(2010、2011、2012、2013 ....etc)并具有“;”为分离。我怎么能做到这一点?我认为唯一的选择应该是正则表达式,但我对它不是很好,所以我可以得到我想要的输出?我正在使用 python 3,非常感谢您的宝贵时间!

【问题讨论】:

  • 使用的工具是翻译功能,split()sort()join()

标签: python python-3.x date calendar


【解决方案1】:

您应该考虑到“%B %Y”需要完整的月份名称,因为罗马尼亚语和英语的月份缩写在所有情况下都不相同

from datetime import datetime
thislist = [[1, 'August 2014, September 2016, January 2014, February 2016', 2],
            [5, 'August 2015, September 2012, January 2015, February 2017', 4]]
sorted_list = []
months = []
i = 0
for dates in thislist:
    sorted_list = []
    chgDates = dates[1].split(",")
    for test1 in chgDates:
        sorted_list.append(test1.strip())
    test = sorted(sorted_list, key=lambda x: datetime.strptime(x, "%B %Y"))
    str1 = ', '.join(test)
    thislist[i][1] = str1.replace(",", ";")
    i = + 1

print(thislist)

回复:

[[1, 'January 2014; August 2014; February 2016; September 2016', 2], [5, 'September 2012; January 2015; August 2015; February 2017', 4]]

【讨论】:

  • 谢谢克里斯蒂安,我无法为排序创建地图?我的意思是将英语名称与罗马尼亚语名称进行映射,以便在罗马尼亚语中对其进行排序?
  • 而且我也不需要在每年的每个月之后(检查我的示例以获得所需的输出,'2014 年 1 月;2014 年 8 月;2016 年 2 月;2016 年 9 月'应该是 '1 月,2014 年 8 月; 2016 年 2 月、9 月'
【解决方案2】:

现在您可以从英语-> 罗马尼亚语翻译。您应该阅读一些关于 python 中的列表和字典的内容。如果您只是等待社区,我认为您不会收到完整的答案。

from datetime import datetime
import re
thislist = [[1, 'August 2014, September 2016, January 2014, February 2016, March 2016', 2],
            [5, 'August 2015, September 2012, January 2015, February 2017', 4]]
sorted_list = []
months = []
i = 0


def translateInRo(string, dyct):
    substrs = sorted(dyct, key=len, reverse=True)

    regexp = re.compile('|'.join(map(re.escape, substrs)))

    return regexp.sub(lambda match: dyct[match.group(0)], string)


for dates in thislist:
    sorted_list = []
    chgDates = dates[1].split(",")
    for test1 in chgDates:
        sorted_list.append(test1.strip())
    test = sorted(sorted_list, key=lambda x: datetime.strptime(x, "%B %Y"))
    str1 = ', '.join(test)
    translate = translateInRo(
        str1, {"September": "Septembrie", "January": "Ianuarie", "September": "Septembrie", "February": "Februarie", "March": "Martie"})
    thislist[i][1] = translate
    i = + 1

print(thislist)

【讨论】:

  • 这看起来几乎完美,它有一种方法可以删除年份,只让最后一个条目年份从这个 'Ianuarie 2014, August 2014, Februarie 2016, Martie 2016, Septembrie 2016', 2] 到这个 ['Ianuarie, August 2014, Februarie, Martie, Septembrie 2016', 2],也许有一些正则表达式?
猜你喜欢
  • 2018-07-07
  • 2013-01-18
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多