Python 使用函数和for循环反转列表项的内部顺序。

Python 使用函数和for循环反转列表项的内部顺序。,python,list,reverse,Python,List,Reverse,我需要帮助理解一个给我带来很多麻烦的家庭作业。我尝试了许多不同的方法来获得以下任务,以产生期望的结果: 创建名为task_05.py的模块 创建名为flip_keys()的函数,该函数接受一个参数: A.名为to_flip的列表。假设此列表中有嵌套的、不可变的序列,例如:[(1,2,3),“hello”] 使用for循环循环列表并反转内部序列的顺序。外部列表上的所有操作都必须在 原始对象,利用其易变性。内在因素 是不可变的,需要替换 函数应返回其内部元素颠倒的原始列表 我的教授将通过在pytho

我需要帮助理解一个给我带来很多麻烦的家庭作业。我尝试了许多不同的方法来获得以下任务,以产生期望的结果:

  • 创建名为task_05.py的模块
  • 创建名为flip_keys()的函数,该函数接受一个参数: A.名为to_flip的列表。假设此列表中有嵌套的、不可变的序列,例如:[(1,2,3),“hello”]
  • 使用for循环循环列表并反转内部序列的顺序。外部列表上的所有操作都必须在 原始对象,利用其易变性。内在因素 是不可变的,需要替换
  • 函数应返回其内部元素颠倒的原始列表
  • 我的教授将通过在python shell中输入以下内容来评估我脚本的结果:

    >>> LIST = [(1, 2, 3), 'abc']
    >>> NEW = flip_keys(LIST)
    >>> LIST is NEW
    True
    >>> print LIST
    [(3, 2, 1), 'cba']
    
    我不知道我做错了什么,我的教授也没有回应。学生们也没有回应,我已经多次复习了材料,试图找到答案。我的脑子里有点不对劲

    他提供了以下提示,我相信我已经在我的脚本中实现了这些提示:

    暗示

    考虑如何访问或更改列表的值。你做到了 已经在任务2中了

    暗示

    为了将中的值更改为_flip,您需要知道一些方法 您正在尝试更改的索引。为此,请创建一个变量 充当计数器并在循环中递增,例如:

    对于iterable_对象中的值,计数器=0:

    做一些计数器+ = 1现在考虑计数器可以代表什么。在这个循环的末尾,没有计数器== len(iterable_对象)

    暗示

    要了解如何反转元组,请回到前面的 使用切片语法反转字符串时的赋值

    以下是我最新的没有注释的脚本(因为在脚本运行之前我不会将它们写入):

    当我使用上面粘贴的命令测试脚本时,我得到以下结果:

    >>>LIST = [(1, 2, 3), 'abc']
    >>>NEW = flip_keys(LIST)
    >>>LIST is NEW 
    False
    >>>print flip_keys(LIST) 
    [(3, 2, 1), 'cba']
    >>>print LIST 
    [(1, 2, 3), 'abc']
    
    任务的目标是体验易变性,我想我理解。我面临的问题是,LIST变量应该由函数更新,但这种情况从未发生过

    下面的计算结果应该是True,而不是false。然后打印存储在列表常量中的反转列表值

    >>>LIST = [(1, 2, 3), 'abc']
    >>>NEW = flip_keys(LIST)
    >>>LIST is NEW False
    

    请让我知道这是否是足够的信息。我在这方面花了太多时间,现在我的作业晚了4天,我没有得到教授或学生的支持(我已经通知了我的导师)

    您正在从函数返回一个新列表。使用完整的切片
    [:]
    赋值对原始列表进行就地变异

    您还可以使用更传统的方法创建列表-列表理解-而不是for循环:

    def flip_keys(to_flip):
        to_flip[:] = [i[::-1] for i in to_flip]
        return to_flip
    

    测试

    >>> LIST = [(1, 2, 3), 'abc']
    >>> NEW = flip_keys(LIST)
    >>> NEW
    [(3, 2, 1), 'cba']
    >>> NEW is LIST
    True
    

    在我看来,改变一个可变的参数并返回它是不正确的/传统的。这将有助于你在下一节课上进行很好的讨论。

    我想如果我更新我的答案,它会像你的一样。所以我会删除我的+1:-)谢谢你的快速回复。我认为这项任务只是为了演示列表中不可变数据类型的可变性。我不记得在课堂上看到过这样的语法,但我想我明白发生了什么。to_flip[:]告诉python查看列表中的每个值。改变值的循环是声明一个局部变量来存储从to_flip的每个值,然后将其反转并添加回列表中。我说得对吗?有没有更好的方法来解释这一点?有点,但变量是理解的局部变量(在Python3中)。翻转每个项目以创建一个新对象,然后使用这些项目构建一个新列表。使用完整片分配使用新列表中的值更新旧列表此语法仅在python 3.0中引入吗?我使用的是2.7.6(我相信)。当然不是版本3。另外,您将如何处理此任务以传统方式完成它?如果你不介意的话,我很想知道。
    >>> LIST = [(1, 2, 3), 'abc']
    >>> NEW = flip_keys(LIST)
    >>> NEW
    [(3, 2, 1), 'cba']
    >>> NEW is LIST
    True