首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python / Collections -删除出现相同次数的元素

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

Stack Overflow用户
提问于 2016-05-11 18:45:49
回答 5查看 99关注 0票数 3

示例1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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将被删除,它们是在列表中出现2次的3个元素。在示例2中,Rob和Jhon将被删除,而Sam和Mike将被保留在列表中。如果列表中只出现1个元素(例如Jhon n次),则不会删除任何内容。

EN

回答 5

Stack Overflow用户

发布于 2016-05-11 18:56:16

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

代码语言:javascript
复制
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)

这将会给你留下:

代码语言:javascript
复制
['Mike']

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

代码语言:javascript
复制
[name for name, v  in list_counter.items() if v == 1 or times[v] < 2]

如果你想保留所有的Mike,那么遍历列表:

代码语言:javascript
复制
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)

这将为您提供:

代码语言:javascript
复制
 ['Mike', 'Mike', 'Mike']
票数 1
EN

Stack Overflow用户

发布于 2016-05-11 19:19:29

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

代码语言:javascript
复制
>>> 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}
>>> 
票数 1
EN

Stack Overflow用户

发布于 2016-05-11 19:25:51

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

代码语言:javascript
复制
values = collections.Counter(list_counter.values())
result = [item for item in list if values[item] >= 2]

但是,我不会使用list作为变量名,因为它隐藏了内置类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37160325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档