2017-05-12 91 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] 
相关问题