像:
这样的整数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
答案 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)
在这里,我使用log10
和ceil
来计算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)