我想输入一个8位数字,例如。'12345678'
,删除并保存最后一位数字(例如'8'
)反转7个剩余数字(例如'7654321'
)并乘以乘以2的第1,第3,第5,第7(奇数)数字。
我认为我已经解决了前两个任务,但却在努力解决如何增加奇数的问题。
到目前为止,代码是:
cardnumber = input("Enter a number")
check_digit = int(cardnumber[7])
revnumber = cardnumber[-2:-9:-1]
示例:
然后我想将序列中的奇数乘以 - 第1,第3,第5和第7个数字:
所以7,6,5,4,3,2,1变为14,6,10,4,6,2,2。
我对python很新,所以如果你能解释我会非常感激。
答案 0 :(得分:3)
的
number = input("Enter the number: ")
12345678
的
numbers = map(int, str(number))
[1,2,3,4,5,6,7,8]
的
last = numbers[-1]
8
的
rev = list(reversed(numbers[:-1]))
[7,6,5,4,3,2,1]
的
multiplied = [i*2 if j % 2 == 0 else i for j, i in enumerate(rev)]
[14,1,6,10,4,6,2,2]
答案 1 :(得分:3)
试试这个: - 它可能对你有帮助
number = 12345678
rev = 0
#this block gives reverse number
while number > 0:
rem = number % 10
rev = rev*10 + rem
number = int(number/10)
#number convert to list
number_list = [int(i) for i in str(rev)]
#take only 7654321
number_list1 = number_list[1:len(number_list)]
print(number_list1) #print 7654321
#for multiply by 2 the 1st,3rd,5th,7th (Odd) numbers
for i in range(len(number_list1)):
if number_list1[i]%2 != 0:
print(number_list1[i]*2)
输出: -
[7, 6, 5, 4, 3, 2, 1]
14
10
6
2
答案 2 :(得分:1)
cardnumber = input("Enter a number")
check_digit = int(cardnumber[7])
revnumber = cardnumber[-2:-9:-1]
现在您可以将reduce
与mul
运算符一起使用:
from operator import mul
reduce(mul, for x in revnumber if int(x)%2=0)
这种语法非常紧凑(就像你的代码一样),但如果你想要更具可读性的东西,可以考虑使用代替循环。
答案 3 :(得分:1)
初学者:
cardnumber = input("Enter a number")
check_digit = int(cardnumber[7])
revnumber = cardnumber[-2:-9:-1]
s = ''
for index,v in enumerate(revnumber):
if index%2 == 0:
s = s + v
else:
s = s + str(int(v)*2)
revnumber = int(s)
print(revnumber)
答案 4 :(得分:1)
这是一个单行(不一定是最好的解决方案,但总是很高兴看到):
>>> n = '12345678'
>>> s = ''.join(i if int(i) % 2 == 0 else str(2*int(i)) for i in n[-2::-1])
146104622
<强>解释强>
n[-2::-1]
是n
的切片,从最后一个元素到第一个元素(索引0
)的步长为-1
,对应于输入字符串减去最后一个字符,反转。
(i if int(i) % 2 == 0 else str(2*int(i))
是以下内容的唯一内容:
if int(i) % 2 == 0:
i
else:
str(2*int(i))
最外侧括号中的内容是一个生成器,通过for
迭代在已处理的字符串上构建。这或多或少等于:
l = []
for i in n[-2::-1]:
if int(i) % 2 == 0:
l.append(i)
else:
l.append(str(2*int(i)))
最后,在空字符串join
上调用''
字符串方法,并将所述生成器作为参数。
它连接生成器的所有元素,用空字符串分隔它们,即没有任何东西。
答案 5 :(得分:1)
试试这个完全有效的例子:
new_list = []
cardnumber = input("Enter a number: ")
check_digit = int(cardnumber[7])
revnumber = cardnumber[-2:-9:-1]
for number in revnumber:
if int(number) % 2 != 0:
new_list.append(int(number)*2)
else:
new_list.append(int(number))
print(revnumber)
print(new_list)
输出:
Enter a number: 12345678
7654321
[14, 6, 10, 4, 6, 2, 2]
还有一个打印输出可以摆脱括号:
print(",".join(map(str, new_list)))
会给出一个输出:
14,6,10,4,6,2,2
如果要从大于9的输出项中提取9:
new_list = []
cardnumber = input("Enter a number: ")
check_digit = int(cardnumber[7])
revnumber = cardnumber[-2:-9:-1]
for number in revnumber:
if int(number) % 2 != 0:
new_list.append(int(number)*2)
else:
new_list.append(int(number))
print(revnumber)
for i, number in enumerate(new_list):
if new_list[i] > 9:
new_list[i] -= 9
print(",".join(map(str, new_list)))
答案 6 :(得分:1)
k="12345678"
k_2=k[::-1][1:][1::2] # get the digit with pair index
k_1=k[::-1][1:][0::2] # get the digit with impair index, the odds
l_1=[str(int(x)*2) for x in k_1] # multply per 2
result = [None]*(len(l_1)+len(k_2)) # merger two lists l_1 and k_2
result[::2] = l_1
result[1::2] = k_2
res = ''.join(result)
输出:
'146104622'
答案 7 :(得分:1)
You can use zip_longest
from itertools
module with string slicing
:
from itertools import zip_longest
def mul_odds(num):
if len(num) != 8:
return ''
return ''.join(str(int(k)*2)+v for k, v in zip_longest(a[-2::-2], a[-3::-2], fillvalue=''))
Also, here is another example how you can solve your task using map()
, join()
and string slicing
:
def mul_odds(num):
if len(num) != 8:
return ''
return ''.join(map(lambda x: str(int(x[1])*2) if x[0]%2 != 0 else x[1], enumerate(num[-2::-1], 1)))
Both will output:
>>> mul_odds('12345678')
'146104622'