2017-05-12 94 views
3

我知道如何刪除列表中的元素列表的元素時,它沒有一定的規模,如:刪除不具有相同的長度,因爲大多數的條目

x = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2],[1,2,3],[1,2,3],[1,2,3,4]] 
y = [s for s in x if len(s) == len(x[0])] 

x是原始列表,並且y是新列表。正如你在第一個中看到的那樣,有一個條目不像其他條目那麼長,而另一條則比其他條目長。

我想刪除一個元素,每次它不具有與列表中大多數元素相同的長度。只要列表中的第一個元素具有與大多數元素相同的長度,展示方法就可以工作。

所以問題是如何獲得最常見的元素長度?沒有循環遍歷整個長度。平均值不起作用,因爲平均值不代表大部分長度,但平均元素長度(例如長度3,3,3,30將給出〜10的平均值,而長度的主要值爲3)。

+0

我認爲,中位數會做,但我不太清楚,如果中位數也代表了一個數組中最常見的值。然而@Moses Koledoye的解決方案工作正常 – Kev1n91

回答

6

可以使用collections.Counter對象,以保持所有長度的計數的跟蹤,然後篩選使用most_common長度:

from collections import Counter 

x = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2],[1,2,3],[1,2,3],[1,2,3,4]] 
lens = Counter(len(i) for i in x) 
y = [s for s in x if len(s) == lens.most_common(1)[0][0]] 
print y 
# [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] 

注意,如果有領帶,長度之一是隨機選擇的。

2

最常見的值稱爲「模式」(統計上),這樣得到的模態值只使用statistics.mode(但它需要Python 3.4+):

>>> from statistics import mode 
>>> l = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2],[1,2,3],[1,2,3],[1,2,3,4]] 
>>> most_common_length = mode([len(sublist) for sublist in l]) 
>>> most_common_length 
3 
>>> [sublist for sublist in l if len(sublist) == most_common_length] 
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] 

如果statistics.mode太慢(或者您使用的是一個老的Python),這裏還有一個實現:

>>> from scipy.stats import mode 
>>> most_common_length = mode([len(sublist) for sublist in l]).mode[0] 
相關問題