将列表中的奇数或偶数乘以

时间:2017-06-19 12:51:05

标签: python

我想输入一个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]

示例:

  • 用户输入' 12345678'
  • 然后删除最后一位数字并将其存储为校验位' 8'
  • 然后我选择了' 1234567'
  • 我将其反转并拥有7654321

然后我想将序列中的奇数乘以 - 第1,第3,第5和第7个数字:
所以7,6,5,4,3,2,1变为14,6,10,4,6,2,2。

我对python很新,所以如果你能解释我会非常感激。

8 个答案:

答案 0 :(得分:3)

  1. 第一步 - 阅读输入:
  2. number = input("Enter the number: ")
    
      

    12345678

    1. 第二步 - 将输入转换为列表:
    2. numbers = map(int, str(number))
      
        

      [1,2,3,4,5,6,7,8]

      1. 第三步 - 读取最后一位数字:
      2. last = numbers[-1]
        
          

        8

        1. 第四步 - 反转清单:
        2. rev = list(reversed(numbers[:-1]))
          
            

          [7,6,5,4,3,2,1]

          1. 最后一步 - 生成一个每两个数字相乘的列表:
          2. 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]

现在您可以将reducemul运算符一起使用:

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'