For循环还是Lambda函数?

2024-07-03 08:09:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这两个代码,它们都(现在只有第一个)应该返回重复序列的长度(13,6,6,14,6和13,6,6,14,6):

l = [13, 6, 6, 14, 6, 13, 6, 6, 14, 6]

def count_period(l): 
    
    l_max = int((len(l)/2)+1)

    for i in range(2, l_max):
        interval1 = l[0:i] 
        intervallo2 = l[i:2*i]
        if interval1 == interval2:
            return i

以及:

l = [13, 6, 6, 14, 6, 13, 6, 6, 14, 6]

l_max = int((len(l)/2)+1)
period_value= next(filter(lambda x: [l[0:x] == l[x:2*x] in range(2, l_max)], l), None)

为什么第一个代码返回正确的值(5),而第二个代码返回13?我做错了什么?关于这个主题:由于我是Python的新手,从一般的角度来看(而不是本例),我如何知道我应该遵循哪条路径来获得好的代码(具有低执行时间和低圈复杂度)?例如,在本例中(假设我还没有写任何东西),我应该遵循这两种(或另一种)方式中的哪一种?谢谢大家!


Tags: 代码inforlenifdefcountrange
1条回答
网友
1楼 · 发布于 2024-07-03 08:09:01

您应该过滤range(2, l_max)而不是l以将代码从顶部转换为过滤器。现在,对于l中的每个值,您正在定义要使用的过滤器的谓词lamdba中创建一个列表。如果该列表中有项目,它将返回true,只有空列表将返回false。过滤器然后决定如果通过谓词,则保留值x,如果不通过谓词,则丢弃该值。因此,它保留了原始列表中的所有项目,而该列表中的next是13。您应该这样做:

l = [13, 6, 6, 14, 6, 13, 6, 6, 14, 6]

l_max = int((len(l)/2)+1)
period_value= next(filter(lambda x: l[0:x] == l[x:2*x], range(2, l_max)), None)

相关问题 更多 >