配对数字的数字

时间:2017-12-24 14:25:21

标签: python python-3.x

我希望编写一个从键盘获取数字的Python程序,并输出一个从原始数字的每对数字的最小值构建的数字。例如:

Enter number please:  84372216
Original number: 84372216 
New number:   4321

我有一个想法是将原始数字转换为字符串,在奇数位置和偶数位置创建数字列表(字符),然后通过列表的索引进行比较。这听起来效率太高或不易实现,因为它涉及从int到string的过多转换,反之亦然。优点是,这很容易解决数字奇数的问题。

有没有办法在不使用字符串的情况下解决这个问题?

谢谢。

5 个答案:

答案 0 :(得分:3)

在原始数字的切片上使用zip(),并在返回的每个min()上使用tuple

>>> number = input('Enter number please: ')
Enter number please: 84372216
>>> print('Original number: {}'.format(number))
Original number: 84372216
>>> new_number = ''.join(min(tup) for tup in zip(number[::2], number[1::2]))
>>> print('New number: {}'.format(new_number))
New number: 4321

答案 1 :(得分:2)

num = 84372216
int(''.join(min(i) for i in zip(*[iter(str(num))]*2)))
#4321

list(zip(*[iter(str(num))]*2))将num分成对,如下所示

[('8', '4'), ('3', '7'), ('2', '2'), ('1', '6')]

然后使用minjoin组合来获取输出

答案 2 :(得分:2)

Transhuman的回答很酷,但这里的版本更易读:

s = str(num)
r = int(''.join(min(s[i:i+2]) for i in range(0, len(s), 2)))

另一个好玩的技巧是使用re.findall

r = int(''.join(min(i) for i in re.findall('..', str(num))))

修改

我没有注意到你说过#34;没有使用字符串"。在那种情况下:

def f(n):
    return n if n < 10 else min(n % 10, n // 10 % 10) + 10 * f(n // 100)

答案 3 :(得分:1)

它既快又脏,但它确实有效:

def pairmin( n ):
        result = 0
        mult = 1
        while n > 0:
                if n > 10:
                        result =  min( n % 10, (n / 10) % 10 ) * mult + result
                else:
                        result = n * mult + result
                n = n / 100
                mult = mult * 10
        return result

print( pairmin( 84372216 ) )
print( pairmin( 8372216 ) )

答案 4 :(得分:1)

Vaultah在上述评论中发布的内容略有不同。您可以使用map函数,为其提供连续的对,并从中确定最小值。

 s = "84372216"
 "".join(list(map(lambda x,y: str(min([x,y])), s[::2],s[1::2])))
 #'4321'

这里map(lambda x, y: str(min([x,y]))从iterable s[::2],s[1::2]获取两个参数,并确定提供的args的最小值是多少。最小结果将转换为str以加入最终结果。但是,如果您需要进一步处理结果,则可以将结果强制转换回int。只需将int()添加到整体表达式中。

要取消s[::2],s[1::2],请检查Understand Python Slice Notation。切片表示法的作用类似于s[start:end:step]