Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数,该函数仅适用于列表列表中的前两个列表_Python_Python 3.x_List - Fatal编程技术网

Python 函数,该函数仅适用于列表列表中的前两个列表

Python 函数,该函数仅适用于列表列表中的前两个列表,python,python-3.x,list,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,

我有以下清单:

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。最后一个是复制。

您可以尝试以下方法:

import re
import itertools

def orderdates(full_date):
    table = {"January": "Ian", "February": "Feb", "March": "Mar", "April": "Apr", "May": "Mai", "June": "Iun", "July": "Iul", "August": "Aug", "September": "Sept", "October": "Oct", "November": "Nov", "December": "Dec"}
    l = ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sept", "Oct", "Nov", "Dec"]
    new_dates = re.split(",\s", full_date)
    final_dates = [[a, int(b)] for a, b in [i.split() for i in new_dates]]

    new_dates = sorted(final_dates, key = lambda x: x[-1])

    current = [list(b) for a, b in itertools.groupby(new_dates, lambda x: x[-1])]
    new_current = [[table[i]+" "+str(b) for i, b in c] for c in current]
   final_current = [sorted(b, key= lambda x:l.index(x.split()[0])) for b in new_current]
  return list(itertools.chain.from_iterable(final_current))


mylist = [[1890731350060, 'January 2016, February 2016, March 2015', '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]]

new_data = [[i[0], orderdates(i[1]), i[2:]] for i in mylist]

new_data = [list(itertools.chain(*[[b] if not isinstance(b, list) else b for b in i])) for i in new_data]
print(new_data)
输出:

[[1890731350060, 'Mar 2015', 'Ian 2016', 'Feb 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]]

问题

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

  • 按时间排序日期
  • 根据翻译词典缩写月份
  • 这可以通过以下方式完成:

    # 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\u dates()
    函数接受名为
    mylist
    的列表作为和参数。在函数内部,我们首先创建一个名为
    transformed\u list
    的新列表,稍后我们会将项目附加到该列表中。现在,我们在
    iterable
    (相当于
    mylist
    )上循环,以获取每个
    子列表
    ,并跟踪它们的索引位置(
    i

    我们将
    子列表
    的副本添加到
    转换日期
    (因此是
    [:]
    ,因为这样可以防止我们修改
    mylist
    中的原始项)。然后我们开始处理包含日期字符串的第一个索引。我们清理字符串,首先将其拆分为一个月-年对列表,然后
    去除尾随和前导空格,例如
    ['2016年2月','2016年3月','2016年1月]
    。如果存在任何重复的日期,则
    set()
    会删除这些日期,因为集合是唯一元素的集合

    为了准备下一步,我们利用这个机会对它们进行排序,并按单个空格进一步拆分它们。拆分会生成一个临时嵌套列表,例如
    [[[1月]、[2016年]、[2月]、[2016年]、[3月]、[2016年]]

    最后,对于后一个嵌套列表中的每个项目,我们使用
    TRANSLATE
    字典和
    join()
    将月份缩略为年份,并创建一个新字符串列表,例如
    ['2016年1月','2016年2月','2016年3月]
    。然后我们执行最后一个
    join()
    ,其中每个项目由逗号分隔(根据要求),例如
    “2016年1月、2016年2月、2016年3月”


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

    我不理解输入到输出的映射。我认为,所有的英文月份名称都要映射到罗马尼亚名称。首先,“2016年2月、2016年3月、2016年1月”对应于“2016年2月、2016年2月、2016年3月”
    ;也就是说,第三次约会变成了第一次。但在第二种情况下,
    “2015年5月、2015年6月、2015年4月”
    变为
    “2016年5月、2016年5月、2016年4月”
    。现在,第3项仍然保留,第1项和第2项已交换。如果您有兴趣按日历订购日期,我相信您预期的代码中的
    '2016年6月、2016年5月、2016年4月'
    是不正确的。应该是
    '2015年4月-2015年5月-2015年6月'
    您是否有理由将
    J
    更改为
    I
    并将
    y
    更改为
    I
    ?可以将此输出:[1890731350060,['Ian 2016',2016年2月',['Amensurezatia DE HRANA',1183]]更改为:[1890731350060,'伊恩2016','2016年2月','2016年3月','哈拉纳赔偿',1183]我不需要额外的列表,请检查所需的输出以及它需要的格式。@TatuBogdan请查看我最近的编辑。现在输出的格式正确。我现在看到的唯一问题是它没有根据年份进行适当的排序,例如,如果第一个列表是:[1890731350060,'2016年2月,2015年3月,2016年1月,'Emergizatia DE HRANA',1183]如果[1890731350060,'2015年3月,'Ian 2016,'2016年2月,'Emergizatia DE HRANA',1183]输出将为[1890731350060,'2016年3月,'Emergizatia DE HRANA',1183]需要注意的是,我使用2015年作为3月份的年份,应该按年份排序,然后再按月份排序。看起来不错,但日期不是我想要的格式:[1890731350060,'2015年3月','2016年2月','2016年2月','Remongezatia DE HRANA',1183]应该是[1890731350060,'2015年3月,2016年2月','Remongezatia DE HRANA',1183],我需要它们都在同一个索引中[1] 您好,非常感谢您的回复,可以用逗号分隔日期,如:[1890731350060,'Ian 2016,2016年2月,2016年3月,'Remongezatia DE HRANA',1183]?我也希望从中获得一个函数,因为我必须在许多列表中使用它。当然。
    “,”。join()
    并定义一个函数返回结果。我已经编辑了答案。是的,这就像我预期的那样工作,非常感谢!你太棒了,我会小心地在你的代码中确认你的帖子。再次感谢!