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

时间:2014-08-10 23:40:43

标签: python join dictionary

我有一个名为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的新手

4 个答案:

答案 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'   

(乘,不加)

您可以使用starmapreduce

轻松核对
>>> 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关于+不知道如何处理intstr

原因是,在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)