Python / Collections - 删除出现次数相同的元素

时间:2016-05-11 10:45:49

标签: python collections

示例1:

import collections

list = ['Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob', 'Carl', 'Carl']
list_counter = collections.Counter(list)
>> Counter({'Mike': 3, 'Rob': 2, 'Jhon': 2, 'Carl': 2})

示例2:

import collections
list = ['Sam', 'Sam', 'Sam', 'Sam', 'Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob']
list_counter = collections.Counter(list)
>> Counter({'Sam': 4, 'Mike': 3, 'Rob': 2, 'Jhon': 2})

我想要做的就是验证列表中是否会出现2个或更多元素相同的次数,并删除它们。

在示例1中,Rob,Jhon和Carl将被删除,它们是3个元素,在列表中出现2次。在示例2中,Rob和Jhon将被删除,而Sam和Mike将会被删除并留在列表中。如果列表中只出现1个元素(例如Jhon n次),则不会删除任何内容。

5 个答案:

答案 0 :(得分:1)

如果要删除至少两次以相同频率出现的所有名称:

import collections

lst = ['Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob', 'Carl', 'Carl',
       "foo","foo","foo","foo","bar", "bar", "bar", "bar"]
list_counter = collections.Counter(lst)

# count the frequency 
times = collections.Counter(list_counter.values())

# keep names that do not appear at the same frequency as any other names
lst[:] = [name for name,v  in list_counter.items() if times[v] < 2]
print(lst)

会让你:

['Mike']

如果您还想确保计数不是1:

[name for name, v  in list_counter.items() if v == 1 or times[v] < 2]

如果你想保留所有的Mikes,那么迭代列表:

import collections

lst = ['Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob', 'Carl', 'Carl',
       "foo","foo","foo","foo","bar", "bar", "bar", "bar"]
list_counter = collections.Counter(lst)
times = collections.Counter(list_counter.values())

lst[:] = [name for name in lst if times[list_counter[name]] < 2]
print(lst)

哪会给你:

 ['Mike', 'Mike', 'Mike']

答案 1 :(得分:1)

我的方法是首先将具有相同count的所有元素分组到defaultdict对象中,然后根据过滤条件构建结果字典:

>>> from collections import Counter, defaultdict  
>>>
>>> lst = ['Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob', 'Carl', 'Carl']
>>> c = Counter(lst)
>>> c
Counter({'Mike': 3, 'Carl': 2, 'Rob': 2, 'Jhon': 2})
>>>
>>> d = defaultdict(list)
>>> 
>>> for k,v in c.items():
        d[v].append(k)
>>> 
>>> d
defaultdict(<class 'list'>, {2: ['Jhon', 'Rob', 'Carl'], 3: ['Mike']})
>>>
>>> result = dict((*v,k) for k,v in d.items() if len(v) < 2)
>>> result
{'Mike': 3}
>>> 

答案 2 :(得分:1)

您可以使用.values()找到所有不同的金额,然后对>=次出现的值进行列表理解:

values = collections.Counter(list_counter.values())
result = [item for item in list if values[item] >= 2]

但是,我不会将list用作变量名,因为它会影响内置类型。

答案 3 :(得分:0)

如果我做对了,你想保留这些名字的次数超过2次。 在这种情况下:

[x for x,y in list_counter.iteritems() if y>2]

答案 4 :(得分:0)

import collections
your_list = ['Sam', 'Sam', 'Sam', 'Sam', 'Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob']
list_counter = collections.Counter(your_list)
filtered_list = [item for item in your_list if list_counter.get(item) != 2]
result = list(set(filtered_list))

过滤后的列表是一种python列表理解方式,用于比较列表项是否有计数器!= 2.

如果是示例二。

[&#39;迈克&#39;迈克&#39;迈克&#39;]

现在正在做

列表(集(filtered_list))

[&#39;麦克&#39;]

您不应将变量命名为&#39; list&#39;。