2017-06-02 50 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'將停止。 –

相關問題