Python"设置"具有重复/重复元素

cam*_*mil 35 python collections dictionary set

是否有标准方法来表示可以包含重复元素的"集合".

据我所知,一个集合只有一个或零个元素.我希望功能有任何数字.

我目前正在使用一个字典,其中元素作为键,数量作为值,但由于许多原因,这似乎是错误的.

动机: 我相信这样的系列有很多应用.例如,对喜欢的颜色的调查可以表示为:survey = ['blue','red','blue','green']

在这里,我不关心订单,但我关心数量.我想做的事情如下:

survey.add('blue')
# would give survey == ['blue', 'red', 'blue', 'green', 'blue']
Run Code Online (Sandbox Code Playgroud)

......甚至可能

survey.remove('blue')
# would give survey == ['blue', 'red', 'green']
Run Code Online (Sandbox Code Playgroud)

注意: 是的,set不是此类集合的正确术语.有更正确的吗?

课程列表可行,但所需的集合是无序的.更不用说为集合命名的方法在我看来更合适.

Ste*_*ski 34

您正在寻找multiset.

Python最接近的数据类型是collections.Counter:

A Counterdict用于计算可哈希对象的子类.它是一个无序集合,其中元素存储为字典键,其计数存储为字典值.计数允许为任何整数值,包括零或负计数.Counter班是类似于其他语言包或者多集.

对于多集的实际实现,请使用bagpypi上的data-structures包中的类.请注意,这仅适用于Python 3.如果您需要Python 2,这里bag为Python 2.4编写的配方.

  • 这里有一个很大的问题:`len(counter_obj)`为您提供了独特元素的数量,但不是您对多重集合所期望的元素总数.但是,您可以像对待集合那样执行所有其他操作,如联合和交叉. (7认同)
  • collections.Counter和pypi的包之间有什么区别? (3认同)

eum*_*iro 14

你对带有元素/计数的dict的方法对我来说似乎没问题.您可能需要更多功能.看看collections.Counter.

  • O(1)测试元素是否存在和当前计数检索(比element in list和更快list.count(element))
  • counter.elements() 看起来像一个包含所有重复项的列表
  • 易操作联合/与其他计数器的区别