为了账号安全,请及时绑定邮箱和手机立即绑定

通过python函数制作“折叠列表”

通过python函数制作“折叠列表”

GCT1015 2023-10-18 16:16:12
这是我第三次尝试解决这个问题,作为一个全新的 python 用户,我真的不明白我的教授想说什么。我需要在 python 中创建一个函数,它接受一个列表并将其“对半”,以便第一个和最后一个术语加在一起,第二个术语和倒数第二个术语等。如果我有一个空白列表,则输出应该为空,如果我有一个奇数列表,则不应将中间项添加到任何内容中。(教授的原始提示:提示:创建一个函数,将列表作为输入,并生成一个“对折”列表,我的意思是输出中的第一项是输入的第一项和最后一项的总和;输出中的第二项是第二项和倒数第二项的总和,依此类推。因此,输入 [10,2,3,1] 将产生 [11,5],而输入 [10,2] ,3] 将产生 [13,2]。如果输入是空列表,则应返回空列表;如果输入是 [5],则输出应为 [5]。)从其他人的帮助指导,这就是我到目前为止所拥有的a = [10, 14, 21, 25, 52, 55]def folded_list(input_list):    a = input_list    folded_list_output = [ a[i] + a[-(i + 1) ] for i in range( len(a) // 2)]    return folded_list_outputprint(folded_list(a))我认为这就是我的教授想要的。然而,他说: 你有一个代码片段,也许可以做你想做的事情(使用一个奇特的“列表理解”,这就是所谓的方括号结构,而不是 for 循环),你只需要把它放在一个函数定义并测试它是否有效。列表理解的使用并不是它不是函数的原因,而是因为 def function_name(arguments): 看不到任何线条。测试“极端情况”总是一个好主意:例如,当您提供空列表作为输入时,它是否会执行您想要的操作?对于具有奇数个元素的列表会发生什么?(提示:它没有做它应该做的事情,因为中间的元素完全被删除了。)我真的不明白他想说什么——我以为我的def folded_list(input_list):   a = input_list   folded_list_output = [ a[i] + a[-(i + 1) ] for i in range( len(a) // 2)]   return folded_list_output正是他在论证部分寻找的内容。有谁明白他的意思以及我应该在代码中尝试修复什么?
查看完整描述

3 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

只是为了好玩,我想尝试使用zip、列表理解和切片表示法。就我个人而言,这更符合逻辑——但也许这只是我不平衡的大脑。


它看起来像这样一团糟:


def folded(lst) -> list:

    """Fold a list by summing opposite ends."""

    r = [a+b for a, b in zip(lst, lst[::-1])][:(len(lst)//2)+1]

    if len(lst) % 2 != 0:

        r = r[:-1] + [r[-1:][0]//2]

    else:

        r = r[:-1]

    return r

输出:


l = [2]

>>> [2]


l = [2, 5]

>>> [7]


l = [2, 5, 8]

>>> [10, 5]


l = [2, 5, 8, 10]

>>> [12, 13]


l = [2, 5, 8, 10, 12]

>>> [14, 15, 8]


查看完整回答
反对 回复 2023-10-18
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

您有一个代码片段,也许可以实现您想要的功能

您可能只向您的教授发送了列表理解。他们希望你发送一个函数

(使用奇特的“列表理解”,这就是所谓的方括号结构,而不是 for 循环),

非常不言自明

您只需将它放在函数定义中并测试它是否有效。列表理解的使用并不是它不是函数的原因,而是因为 def function_name(arguments): 看不到任何线条。

def function_name(argument1, argument2, ...):是什么使该块内的代码成为一个函数。如果您提交此信息:

def folded_list(input_list):
   a = input_list
   folded_list_output = [ a[i] + a[-(i + 1) ] for i in range( len(a) // 2)]  
    return folded_list_output

thenfolded_list是采用单个参数的函数input_list

由于您有一些 FORTRAN 背景,FORTRAN 中的子例程或函数将被归类为 Python 中的函数。还记得在 FORTRAN 中如何function myfunc(arg1, arg2, arg3) result(answer)定义函数吗?你需要def myfunc(arg1, arg2, arg3)用Python说。在 FORTRAN 中,函数必须返回某些内容,但子例程不能。在 Python 中,函数可能返回某些内容,也可能不返回某些内容。这几乎是新手级别的唯一区别。

测试“极端情况”总是一个好主意

极端情况是您期望会破坏代码的情况(但理想情况下不会)。测试极端情况可以确保您的代码稳健,并且在收到时髦但有效的输入时不会中断。

例如,当您提供空列表作为输入时,它会执行您想要的操作吗?

可以?

folded_list([])
# Output: []

当然看起来像它

对于具有奇数个元素的列表会发生什么?(提示:它没有做它应该做的事情,因为中间的元素完全被删除了。)

folded_list([1, 2, 3, 4, 5])
# Output: [6, 6]

嘿!这看起来不对劲!3列表中间的发生了什么?


现在,由于本练习的全部目的是让您学习,因此我不会向您提供所需的代码。不过,您可以使用以下算法:

  • 对于包含奇数个元素的列表,假设为 5,len(list) = 5

  • 所以len(list) // 2 = 2

  • 索引0和1需要添加到3和4上

  • 索引 2 需要单独保留(嘿,看,2 = len(list) // 2

  • 迭代列表的前半部分

    • 如果当前索引小于len(list)//2,则追加list[index] + list[-index]到新列表(负索引只是告诉 Python 向后计数而不是向前计数该元素,因此list[-2]将为您提供倒数第二个元素)

    • 如果索引等于len(list)//2,则追加list[index]

len(list)当偶数时这有效吗?如果它不适用于偶数大小的列表,您能想出一种适用于偶数奇数大小的列表的算法吗?if或者是有条件检查列表大小,然后针对偶数大小运行一种算法,针对奇数大小运行另一种算法的唯一选择?这对你来说是一个练习!

另请注意:当我还是初学者时,我发现首先写出整个循环,然后如果可能的话将其压缩为列表理解更为直观。这个列表的理解:

folded_list_output = [ a[i] + a[-(i + 1) ] for i in range( len(a) // 2)]

如果这样写,就更容易理解(或者至少对我来说是很多年前):

folded_list_output = []

for i in range(len(a) // 2):

    elem1 = a[i]

    elem2 = a[-(i + 1)] 


    folded_list_output.append(elem1 + elem2)


查看完整回答
反对 回复 2023-10-18
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

您可以从 start(假设i)开始迭代到中间并添加i两侧的 th 元素,然后返回新列表:


a = [10, 14, 21, 25, 52, 55]

b = [10, 14, 21, 25, 52, 55, 1]



def folded_list(input_list):

    new_list = []

    l = len(input_list)

    for i in range(l//2):

        new_list.append(input_list[i] + input_list[-i-1])


    if l % 2 != 0:

        return new_list + [input_list[l//2]]

    return new_list



print(folded_list(a))  # [65, 66, 46]

print(folded_list(b))  # [11, 69, 73, 25]


查看完整回答
反对 回复 2023-10-18
  • 3 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信