在python中操作一个整数

时间:2017-08-14 12:34:36

标签: python

像:

这样的整数
number = 1873

我有一个公式:weighted_sum = 1 * 1 + 8 * 2 + 7 * 3 + 3 * 4 = 50.我想计算四位数的加权和,所以输出如下:

1234 weighted sum: 30 / 4321 weighted sum:20

我试图将整数转换为字符串,但是没有用。

number = str(1742)
weighted = number[0]*1 + number[1]*2 + number[2]*3 + number[3]*4
print(number, "weighted sum:", weighted)

输出

1742 Weight Sum: 1774442222

6 个答案:

答案 0 :(得分:4)

在对它们进行多次拼接之前,您需要将各个数字转换回整数:

weighted = int(number[0])*1 + int(number[1])*2 + int(number[2])*3 + int(number[3])*4

只需使用number[i]将为您提供一个包含该数字的单字符字符串,并在Python中乘以字符串bt n意味着将其连接n次。

可以使用sum()和生成器表达式简化:

weighted = sum(i * int(digit) for i, digit in enumerate(number, 1))

答案 1 :(得分:3)

所以如果你想用字符串来做它你必须做这种事情(如果我使用你的逻辑)

number = str(1742)
weighted = int(number[0])*1 + int(number[1])*2 + int(number[2])*3 + int(number[3])*4
print(number, "weighted sum:", weighted)

实际上在python中,如果你将一个字符串乘以一个int,它会多次重复它。例如

>>>"a" * 3
"aaa"
>>>"foo" * 2 
"foofoo"

一种较小的方法是使用列表理解

number = 1742
sum([i * int(nb) for i,nb in enumerate(str(number))])

如果没有字符串的话,有一种丑陋的方式是

number = 1742
weighted = 0
for i in range(0,4):
    temp = number // 10 ** (4-i)
    weighted += i * temp
    number -= temp * 10 ** (4-i)

我尝试使用timeit.timeit进行时间分析,然后得到

  • 我的第一个答案(没有循环)

    >>> timeit.timeit(..., number = 1000000) 1.3271157014933124

  • 对于使用发电机的Sven Marnach的答案

    >>>timeit.timeit("sum(i * int(digit) for i, digit in enumerate(str(1742),1))", number = 1000000) 2.0325663901261066

  • 我的答案使用列表理解

    >>> timeit.timeit("sum([i * int(nb) for i,nb in enumerate(str(1742))])", number = 1000000) 1.918556083665976

  • 我的答案没有任何字符串

    timeit.timeit("number = 1742 ....) 2.8422619991572446

  • 对于没有任何字符串的ikku答案

    >>>timeit.timeit(..., number = 1000000) 1.2137944809691135

因此,我在中使用字符串和循环测试的似乎更快是列表理解

我用字符串测试的更快是我给出的第一个答案

我测试的更快是Ikku回答

答案 2 :(得分:0)

你的方法可以正常工作,除了字符串乘以数字n是python中n次串联的串联,所以"7"*2成为字符串{{1} },而不是数字"77"

你想要实际的整数乘法,因此必须改变这一行:

14

到此:

weighted = number[0]*1 + number[1]*2 + number[2]*3 + number[3]*4

与字符串的转换是否非常有效是一个不同的问题,但它应该有效。

答案 3 :(得分:0)

不使用字符串的方法:

import math

number = 1873
answer = 0
length = math.ceil(math.log10(number))

while length > 0:
    current_digit = number % 10
    answer += current_digit * length
    number = number // 10
    length -= 1

print(answer)

在这里,我使用log10ceil来计算number中的位数。然后我们从右到左遍历所有数字。我们得到current_digit,计算当前值并将其添加到answer。在循环结束时,我们通过删除最后一位数(除以10)来更新number并减少循环变量。

答案 4 :(得分:0)

另一种方法是这个:

dlist=[]
number=1234

while number:
    digit = number % 10
    dlist += [digit]
    number //= 10

print(sum([a*b for a,b in zip(dlist, range(len(dlist),0,-1))]))

简要解释一下: 您将获得该数字的所有数字并将其存储到列表中。

dlist = [4][3][2][1]

然后你拿另一个清单 然后,在zip-command中我们创建另一个列表,从leng-of-your-dlist开始到1(步骤-1):

[4][3][2][1]

然后我们将dlist的每个元素与新生成的列表相乘。

最后,sum命令计算它的总和

答案 5 :(得分:0)

由于此行import React from 'react'; import { connect } from 'react-redux'; import {bindActionCreators} from 'redux'; class Parent extends React.Component { constructor(props) { super(props); this.state = {parentState: 0} } componentDidMount() { this.props.someAction(); // same action called in child component } componentWillReceiveProps(nextProps){ // it gets executed and call child render function if(nextProps.something === true){ this.setState({parentState: 1 }) } if(nextProps.something === false){ this.setState({parentState: -1}) } } render() { if(this.state.parentState == -1){ return( <Child/> ) } else{ return(null) } } } function matchDispatchToProps(dispatch) { return bindActionCreators( { someAction: someAction}, dispatch) //same action in child component called } function mapStateToProps (state){ return { dummyState: state.dummyState // //same state in child component called }; } export default connect(mapStateToProps, matchDispatchToProps)(Parent); ,您的代码无法正常运行。因此,使用以下行代替此行:

weighted = number[0]*1 + number[1]*2 + number[3]*3 + number[4]*4

您的完整代码将是这样的:

weighted = int(number[0])*1 + int(number[1])*2 + int(number[2])*3 + int(number[3])*4

输出:

number = str(1742)
weighted = int(number[0])*1 + int(number[1])*2 + int(number[2])*3 + int(number[3])*4
print(number, "weighted sum:", weighted)

1742 weighted sum: 35

输出:

number = str(1742)
weighted = (number[0])*1 + (number[1])*2 + (number[2])*3 + (number[3])*4
print(number, "weighted sum:", weighted)