Python 3: 字典值和键的连接方法

1 投票
4 回答
1910 浏览
提问于 2025-04-18 16:46

我有一个叫做 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 个回答

0
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)
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'   

(要乘,不是加)

你可以很简单地用starmapreduce来检查一下:

>>> from itertools import starmap
>>> from functools import reduce
>>> reduce(lambda x, y: x*y, starmap(pow, fact.items()))
100
0

我觉得你的问题是这样的(在你把代码格式化好,并且把print放在return之前,这样它才能正常运行):

TypeError: Can't convert 'int' object to str implicitly

…或者是另一个TypeError错误,原因是+不知道怎么处理intstr

出现这个问题的原因是,在你的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,这样你就不用去想哪里需要转换,哪里不需要了。

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

这样你就更接近正确的方向了。

撰写回答