2017-06-02 53 views
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:],但它似乎是更大的名单太慢。其他解决方案?

+0

该解决方案是关于切片没有复制,但python似乎并不是内置或标准方式做到这一点:https://stackoverflow.com/questions/3485475/can-i-create-a-view-on- a-python-list – Leon

+0

你能保证输入列表的长度总是一样吗? –

+0

@PM 2Ring:我使用额外的检查,'len(lst)%2 == 0' – planetp

回答

7

可以在不创建两个子列表的情况下执行检查。真正的大列表可能会更快。

n = len(lst)//2 
all(lst[i]==lst[i+n] for i in range(n)) 

如果你还需要检查你的列表是偶数长,你也可以添加

len(lst)%2==0 

为条件。

+1

Gah,指数。好多了。 –

+0

检测到的错误 - 不适用于奇数长度列表 – Leon

+0

@MartijnPieters我很惊讶指数比islice好。并且(我认为)你不需要2个分支:你只需要后半部分的边界,并使用整个列表作为前半部分,因为当最短序列终止时'zip'将停止。 –

相关问题