删除列表中长度与大多数条目长度不同的元素



我知道如何在列表中没有特定大小时删除元素,例如:

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。

您可以使用

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]]

请注意,如果有领带,则随机选择其中一个长度。

最常见的值称为"mode"(从统计学上讲(,因此要获取模态值,只需使用 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(,scipy 中还有一个实现:

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

最新更新