java - union multiset java 代码到 python (在范围内)

标签 java python

我在将 java 中的 Multiset 类转换为 Python 时遇到问题。我对此有一个特殊的问题 这段 Java 代码到 Python:

public Multiset unionWith(Multiset other)
{
    Multiset result = new Multiset();

    for ( Object object : elts.keySet() )
    {
        for ( int i = 0; i != elts.get(object); ++i )
        {
            result.add(object);
        }
    }

    for ( Object object : other.elts.keySet() )
    {
        for ( int i = 0; i != other.elts.get(object); ++i )
        {
            result.add(object);
        }
    }

    return result;
}

}

这是我制作的整个类(class)。除了 unionWith 之外,一切似乎都有效,我无法弄清楚。我很确定问题出在“范围内”,有一个条件。这在 python 中是如何工作的?

class Multiset:
def __init__(self):
   self.elts= dict()

def contains(self, o):
    if o in self.elts.keys():
        return True
    else:
        return False

def add(self, o):
    if self.contains(o):
        newValue = self.elts.get(o) + 1
        self.elts[o] = newValue
    else:
        self.elts[o] = 1

def remove(self, o):
    if self.contains(o):
        newValue = self.elts.get(o) - 1

        if newValue > 0:
            self.elts[o] = newValue
        else:
            del self.elts[o]


def elements(self):
    return set(self.elts.keys())
@property
def size(self):
    total = 0

    for object in self.elts.values():
        total = total + self.elts.get(object)

    return total
def unionWith(self,other):
    result= Multiset()

    for object in self.elts.values():

        for i in range(0):
            if i is not self.elts.get(object):
                break
            result.add(object)

    for object in other.elts.values():
        for i in range(0):
            if i is not other.get(object):
                break
            result.add(object)

最佳答案

我建议你使用神奇的方法让你的类与Python语言更加集成,例如__iter____contains__:

import collections
import itertools

class Multiset:
    def __init__(self, iterable=None):
        self._data = collections.defaultdict(int)
        if iterable:
            self._data.update(collections.Counter(iterable))

    def __contains__(self, element):
        return element in self._data

    def add(self, element):
        self._data[element] += 1

    def remove(self, element):
        if element not in _data:
            raise KeyError(element)
        elif self._data[element] == 1:
            del self._data[element]
        else:
            self._data[element] -= 1

    def update(self, iterable):
        data = collections.Counter(self._data) + collections.Counter(iterable)
        self._data = collections.defaultdict(int)
        self._data.update(data)

    def elements(self):
        return self._data.keys()

    def __len__(self):
        return sum(self._data.values())

    def __iter__(self):
        return itertools.chain.from_iterable(
            itertools.repeat(element, number) 
                for element, number in self._data.items()
        )

    def union(self, other):
        result = Multiset(self)
        result.update(other)
        return result

    def __repr__(self):
        return 'Multiset([{}])'.format(
            ', '.join(repr(element) for element in self))

测试:

>>> s = Multiset()
>>> s
Multiset([])
>>> s.update('abca')
>>> s
Multiset(['a', 'a', 'c', 'b'])
>>> len(s) # calls __len__
>>> 'a' in s  # calls __contains__
True
>>> r = Multiset('zxc')
>>> r
Multiset(['x', 'c', 'z'])
>>> s.union(r)
Multiset(['a', 'a', 'x', 'c', 'c', 'b', 'z'])

还可以实现更多,例如__add____sub__(差异)、交集...

关于java - union multiset java 代码到 python (在范围内),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51423024/

相关文章:

Python 最佳实践在子模块中导入子模块

python - mod_wsgi中python的时差

java - Neo4j HA(2.0-快照),等待集群选举master超时

Java char/int 转换困惑

java - 在 doFilter 方法中获取 IllegalStateException

java - 显示树中每片叶子的完整路径

python - 从 Python 中的 ISO 周数获取日期

java - 使用 Jacoco 的离线工具进行多模块 Maven 项目,使用 Surefire 覆盖率

python - 按连续事件分组的第一个和最后一个之间的 Pandas 差异

python - 我可以在 Python 中使用错误作为 if..else 语句的条件吗?如果是,怎么办?