我有一个名为factors()
的函数,它返回一个字典,以便值是主要因子,值是这些值作为因子出现的次数,例如:
factors(100)
将导致:
{2: 2, 5: 2}
这是因为2 ** 2 + 5 ** 2 = 100
确定。所以现在我希望脚本能够精确打印:100 = 2**2 + 5**2
我最后尝试了这行代码:
print('So ' + str(x) + ' = ' + **' + '.join(str(key) + '**' + factors.get(key) for key in factors)**)
以下是代码:
def factors(x):
'''
input: int
output: list (prime factors of x list)
'''
num = 2
res = x
factors = {}
howmany = 0
while res > 1:
if res%num == 0:
if num in factors:
factors[num] += 1
else:
factors[num] = 1
res /= num
howmany += 1
print('Found one! <' + str(num) + '>. With these are ' + str(howmany) + ' prime factors for the momment')
print(str(factors))
else:
num += 1
print('DONE!')
return factors
print('So ' + str(x) + ' = ' + ' + '.join(str(key) + '**' + factors.get(key) for key in factors))
谢谢大家。
编辑:当我运行它时,它给了我'返回因子'没有问题,但没有最后一条打印线的线索,它没有打印任何东西。
P.S。:如果格式不好,我很抱歉,我是SO的新手
答案 0 :(得分:0)
>>> fact={2: 2, 5: 2}
>>> ' + '.join(['{}**{}'.format(*t) for t in sorted(fact.items())])
'2**2 + 5**2'
但是,这不是100的主要因素。正确的答案是:
>>> ' * '.join(['{}**{}'.format(*t) for t in sorted(fact.items())])
'2**2 * 5**2'
(乘,不加)
轻松核对>>> from itertools import starmap
>>> from functools import reduce
>>> reduce(lambda x, y: x*y, starmap(pow, fact.items()))
100
答案 1 :(得分:0)
行:
return factors
print('So ' + str(x) + ' = ' + ' + '.join(str(key) + '**' + factors.get(key) for key in factors))
表示print
语句永远不会执行,因为return
结束了该函数。扭转两个:
print('So ' + str(x) + ' = ' + ' + '.join(str(key) + '**' + factors.get(key) for key in factors))
return factors
你应该更接近正轨。
答案 2 :(得分:0)
我相信您的问题(一旦您正确格式化代码,并在print
之前移动return
以使其实际运行)就是:
TypeError: Can't convert 'int' object to str implicitly
...或其他TypeError
关于+
不知道如何处理int
和str
。
原因是,在join
内,您正在执行此操作:
str(key) + '**' + factors.get(key) for key in factors
请注意,您执行了str(key)
,但未执行str(factors.get(key))
。因此,不是连接三个字符串,而是连接两个字符串和一个int。
这可能很难做到,或者至少很难找到你弄错的地方。这是字符串格式化比尝试连接字符串更好的原因之一:
'{}**{}'.format(key, factors.get(key))
format
方法会自动将所有内容转换为str
,因此您无需弄清楚它的位置,也不需要。
答案 3 :(得分:0)
a = {2: 2, 5: 2}
# In one line:
b = ' + '.join([str(row) + '**' + str(a[row]) for row in a])
输出'2**2 + 5**2'
,我确定你可以将它与你的因子输入变量连接起来。
这使用pythons惊人的生成器和for
语法迭代所有结果,并创建一个列表,其中包含与'**'
连接的所有键和键的值。然后,结果列表与字符串' + '
连接在一起。非常简单的东西,你也可以做一个更传统的for循环:
# In multiple lines:
b = []
for row in a:
b.append(str(row) + '**' + str(a[row]))
b = ' + '.join(b)