使用Counter - Python查找GCD

时间:2015-09-15 23:35:11

标签: python counter

我正在尝试使用Counter类计算两个数字的GCD。我已经实现了我的factorisations并使用了一个交集来获得最小因子,但是我不确定我是如何从这里进步的。更具体一点 -

gcd(120,500)让我在一个包含2:2,5:1的计数器

如何以表示2 ^ 2 x 5 ^ 1的方式使用这些数字?

x = Counter(factors(a))  
y = Counter(factors(b))

min = x & y

return min

我当前的输入/输出:

在[29]中:gcd(120,500)

Out [29]:Counter({2:2,5:1})

我对Python很新,所以对于如何进步的任何解释和建议都将不胜感激!谢谢:))

4 个答案:

答案 0 :(得分:0)

循环播放" min"的项目。 启动正在运行的产品,prod = 1 对于每个项目:   关键是乘数;价值就是力量   多个" prod"通过" key"," power"次。

当你经历了" min"中的所有因素时,prod就是你的GCD。

答案 1 :(得分:0)

您可以从Counter对象获取items

>>> counter = Counter({2: 2, 5: 1})
>>> import operator
>>> reduce(operator.mul, (factor ** count for factor, count in counter.items())
20

reduce继续将函数应用于序列中的值和前一个结果,直到它使用了序列中的所有内容。

因此我们将乘法运算符mul应用于生成器生成的所有内容(factor ** count for factor, count in counter.items())

答案 2 :(得分:0)

解决问题和学习Python的最佳方法是以交互方式探索课程。在您的情况下,您可以尝试以下

>>> import collections
>>> counter = collections.Counter()
>>> counter[2] = 2
>>> counter[5] = 1
>>> print counter
Counter({2: 2, 5: 1})
>>> dir(counter)
['__add__', '__and__', '__class__', '__cmp__', '__contains__',   '__delattr__',
 '__delitem__', '__dict__', '__doc__', q__', '__format__', '__ge__', '__getattribute__',
 '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__len__', '__lt__', 
 '__missing__', '__module__', '__ne__', '__new__', '__or__', '__reduce__', '__reduce_ex__', 
 '___', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__sub__', '__subclasshook__',
 '__weakref__', 'clear', ', 'elements', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 
 'iterkeys', 'itervalues', 'keys', 'most_common', ', 'popitem', 'setdefault', 'subtract', 
 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']

在此阶段,您应该探索每种方法的作用

>>> counter.keys()
[2, 5]
>>> counter.values()
[2, 1]
>>> counter.items()
[(2, 2), (5, 1)]

让我们确认items()是正确的方法

>>> help(counter.items)
Help on built-in function items:

items(...)
    D.items() -> list of D's (key, value) pairs, as 2-tuples

然后解决方案很简单 - 我们想要添加每对的指数

>>> [ factor ** count  for factor, count in counter.items()]
[4, 5]
>>> sum([ factor ** count  for factor, count in counter.items()])
9

答案 3 :(得分:0)

我最终找到了一个相当简单的答案 -

x = Counter(factors(a))  
y = Counter(factors(b))

min = x & y

gcd = 1

for key, value in min.items():
    gcd = gcd * key ** value

return gcd

谢谢大家的帮助,我觉得我当然明白如何处理这两个dict课程现在好多了。