python - 仅适用于列表列表中的前两个列表的函数

标签 python python-3.x list

我有这个列表:

mylist = [
    [1890731350060, 'February 2016, March 2016, January 2016', 'INDEMNIZATIA DE HRANA', 1183], 
    [1890922350110, 'May 2015, June 2015, April 2015', 'INDEMNIZATIA DE HRANA', 1183], 
    [1890731350060, 'February 2016, March 2016, January 2016', 'INDEMNIZATIA DE HRANA', 1183]
]

我想要的输出是这样的:

mylist = [
    [1890731350060, 'Ian 2016, Feb 2016, Mar 2016', 'INDEMNIZATIA DE HRANA', 1183],
    [1890922350110, 'Iun 2016, Mai 2016, Apr 2016', 'INDEMNIZATIA DE HRANA', 1183],
    [1890731350060, 'Ian 2016, Feb 2016, Mar 2016', 'INDEMNIZATIA DE HRANA', 1183]
]

为此我有这两个功能:

from datetime import datetime
import re
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)

def orderDateslist(thislist):
    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)
        translate = translateInRo(
            str1, {"January": "Ian", "February": "Feb", "March": "Mar", "April": "Apr", "May": "Mai", "June": "Iun", "July": "Iul", "August": "Aug", "September": "Sept", "October": "Oct", "November": "Nov", "December": "Dec"})
        thislist[i][1] = translate
        i = + 1
    return thislist

当我打印时:

print (orderDateslist(mylist))
[[1890731350060, 'Ian 2016, Feb 2016, Mar 2016', 'INDEMNIZATIA DE HRANA', 1183], [1890922350110, 'Ian 2016, Feb 2016, Mar 2016', 'INDEMNIZATIA DE HRANA', 1183], [1890731350060, 'February 2016, March 2016, January 2016', 'INDEMNIZATIA DE HRANA', 1183]]

最后一个列表不会被计算,我的函数仅适用于列表列表中的前两个列表,后面的列表将保持不变,我希望此函数适用于大量列表,我必须改变什么?我正在使用 python 3。最后一个也是重复的。

最佳答案

问题

为了澄清问题,从您预期的代码来看,您似乎希望将每个子列表索引 1 处的日期字符串替换为:

  1. 按时间对日期排序
  2. 根据翻译词典缩写月份

这可以按如下方式完成:

# Given 
import datetime


mylist = [
    [1890731350060, 'February 2016, March 2016, January 2016', 'INDEMNIZATIA DE HRANA', 1183], 
    [1890922350110, 'May 2015, June 2015, April 2015',         'INDEMNIZATIA DE HRANA', 1183], 
    [1890731350060, 'February 2016, March 2016, January 2016', 'INDEMNIZATIA DE HRANA', 1183]
]

TRANSLATE = {
    "January": "Ian", "February": "Feb", "March": "Mar", "April": "Apr",
    "May": "Mai", "June": "Iun", "July": "Iul", "August": "Aug", 
    "September": "Sept", "October": "Oct", "November": "Nov", "December": "Dec"
}

代码

def transform_dates(iterable, translate=TRANSLATE):
    transformed_lists = []
    for i, sublst in enumerate(iterable):
        transformed_lists.append(sublst[:])

        # Clean dates string
        raw_dates = sublst[1]
        cleaned_dates = set(map(str.strip, raw_dates.split(",")))

        # Sort dates string
        months_yrs = sorted(cleaned_dates, key=lambda x: datetime.datetime.strptime(x, "%B %Y"))
        months_yrs_split = [i.split() for i in months_yrs]

        # Abbreviate months
        abbrev_dates = [" ".join((translate[i[0]], i[1])) for i in months_yrs_split]
        transformed_lists[i][1] = ", ".join(abbrev_dates)
    return transformed_lists

transform_dates(mylist)
# [[1890731350060, 'Ian 2016, Feb 2016, Mar 2016', 'INDEMNIZATIA DE HRANA',1183],
#  [1890922350110, 'Apr 2015, Mai 2015, Iun 2015', 'INDEMNIZATIA DE HRANA',1183],
#  [1890731350060, 'Ian 2016, Feb 2016, Mar 2016', 'INDEMNIZATIA DE HRANA',1183]]
<小时/>

注释

此函数按月份和年份排序。

lst = [1890731350060, 'February 2015, March 2013, January 2016', 'INDEMNIZATIA DE HRANA', 1183], 
transform_dates(lst)
# [[1890731350060, 'Mar 2013, Feb 2015, Ian 2016', 'INDEMNIZATIA DE HRANA', 1183]]

此函数删除重复的日期。

lst = [1890731350060, 'May 2016, June 2016, May 2016, July 2016', 'INDEMNIZATIA DE HRANA', 1183], 
transform_dates(lst)
# [[1890731350060,'Mai 2016, Iun 2016, Iul 2016', 'INDEMNIZATIA DE HRANA', 1183]]

详细信息

如果您是 Python 新手,我会添加这些详细信息以帮助表达正在发生的情况。

transform_dates()函数接受名为 mylist 的列表列表作为和论证。在函数内部,我们首先创建一个名为 transformed_lists 的新列表。我们稍后将向其添加项目。我们现在循环iterable (相当于 mylist )获取每个 sublist并跟踪其索引位置 ( i )。

我们添加 sublst 的副本至transform_dates (因此 [:] 因为这使我们无法修改 mylist 中的原始项目)。然后我们开始处理包含日期字符串的第一个索引。我们清理字符串,首先将其拆分为月年对列表,然后 strip尾随和前导空格,例如['February 2016', 'March 2016', 'January 2016'] 。如果有任何重复的日期,set()删除它们,因为集合是唯一元素的集合。

为了准备下一步,我们借此机会对日期进行排序,并 split他们进一步通过单个空格。拆分会生成一个临时嵌套列表,例如[['January', '2016'], ['February', '2016'], ['March', '2016']] .

最后,对于后一个嵌套列表中的每个项目,我们使用 TRANSLATE 缩写月份。字典和join()它与年份一起返回,制作一个新字符串的列表,例如['Jan 2016', 'Feb 2016', 'Mar 2016'] 。然后我们执行最后的join()其中每个项目都用逗号分隔(根据要求),例如'Jan 2016, Feb 2016, Mar 2016' .

我们已经完成了字符串的转换。现在我们只需替换 transformed_lists 索引 1 处的旧字符串即可。通过将新字符串分配给该索引。总之,我们系统地选择了字符串,对其进行分解、转换、将其重新组合在一起并将其重新分配到列表中的原始位置。我们对每个 sublist 重复此过程。在iterable直到循环完成。结果就是我们的transformed_lists ,由函数返回。

关于python - 仅适用于列表列表中的前两个列表的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45963658/

相关文章:

c# - 在 C# 中从 List<string> 构建字符串

python - 图例透明度,使用次轴时

python - 使用opencv用另一个填充空白图像

python - 如何在 Python 3 中使用 input() 读取文件

python - Windows 上的 GTK3 和 Python3?

python - 从元组列表中获取其元素之间差异最大的元组

java - 自制迭代器bug

python - Poisson 的 E-test 在 Python 中的实现

python - sqlalchemy:alembic 批量插入失败: 'str' 对象没有属性 '_autoincrement_column'

python - 大文件保管箱上传 APIv2 python