Python 3: 字典值和键的连接方法
我有一个叫做 factors()
的函数,它会返回一个字典,这个字典的键是质因数,值是这些质因数出现的次数。例如:
factors(100)
这将得到:
{2: 2, 5: 2}
这是因为 2 的平方加上 5 的平方等于 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))
谢谢大家。
补充说明:当我运行它的时候,它能正常返回 'return factors',但是最后的打印语句没有任何输出。
附言:如果格式不好请见谅,我是新来的。
4 个回答
a = {2: 2, 5: 2}
# In one line:
b = ' + '.join([str(row) + '**' + str(a[row]) for row in a])
这段代码输出的是 '2**2 + 5**2'
,我相信你可以把这个和你的输入变量结合起来。
这里使用了Python非常棒的生成器和 for
语法,来遍历所有的结果,并创建一个包含所有键和它们的值用 '**'
连接起来的列表。最后,这个列表会用字符串 ' + '
连接在一起。其实很简单,你也可以用更传统的for循环来实现:
# In multiple lines:
b = []
for row in a:
b.append(str(row) + '**' + str(a[row]))
b = ' + '.join(b)
>>> 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
我觉得你的问题是这样的(在你把代码格式化好,并且把print
放在return
之前,这样它才能正常运行):
TypeError: Can't convert 'int' object to str implicitly
…或者是另一个TypeError
错误,原因是+
不知道怎么处理int
和str
。
出现这个问题的原因是,在你的join
里,你做了这个:
str(key) + '**' + factors.get(key) for key in factors
注意你把key
转成了字符串str(key)
,但你没有把factors.get(key)
转成字符串str(factors.get(key))
。所以,你实际上是在拼接两个字符串和一个整数,而不是三个字符串。
这可能很难搞清楚,或者至少很难发现你哪里出错了。这也是为什么字符串格式化比单纯拼接字符串要好的原因之一:
'{}**{}'.format(key, factors.get(key))
因为format
方法会自动把所有东西转换成str
,这样你就不用去想哪里需要转换,哪里不需要了。
这段话的意思是:
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
这样你就更接近正确的方向了。