我需要检查一个Python列表是否由两个相等的一半组成。例如,该列表的作用:如何检查列表的前半部分是否与其他部分效率相同?
[6, 2, 0, 2, 3, 2, 6, 2, 0, 2, 3, 2]
这并不
[6, 2, 0, 2, 4, 6]
我试过这个检查:len(lst) % 2 == 0 and lst[:len(lst)//2] == lst[len(lst)//2:]
,但它似乎是更大的名单太慢。其他解决方案?
我需要检查一个Python列表是否由两个相等的一半组成。例如,该列表的作用:如何检查列表的前半部分是否与其他部分效率相同?
[6, 2, 0, 2, 3, 2, 6, 2, 0, 2, 3, 2]
这并不
[6, 2, 0, 2, 4, 6]
我试过这个检查:len(lst) % 2 == 0 and lst[:len(lst)//2] == lst[len(lst)//2:]
,但它似乎是更大的名单太慢。其他解决方案?
可以在不创建两个子列表的情况下执行检查。真正的大列表可能会更快。
n = len(lst)//2
all(lst[i]==lst[i+n] for i in range(n))
如果你还需要检查你的列表是偶数长,你也可以添加
len(lst)%2==0
为条件。
Gah,指数。好多了。 –
检测到的错误 - 不适用于奇数长度列表 – Leon
@MartijnPieters我很惊讶指数比islice好。并且(我认为)你不需要2个分支:你只需要后半部分的边界,并使用整个列表作为前半部分,因为当最短序列终止时'zip'将停止。 –
该解决方案是关于切片没有复制,但python似乎并不是内置或标准方式做到这一点:https://stackoverflow.com/questions/3485475/can-i-create-a-view-on- a-python-list – Leon
你能保证输入列表的长度总是一样吗? –
@PM 2Ring:我使用额外的检查,'len(lst)%2 == 0' – planetp