我希望编写一个从键盘获取数字的Python程序,并输出一个从原始数字的每对数字的最小值构建的数字。例如:
Enter number please: 84372216
Original number: 84372216
New number: 4321
我有一个想法是将原始数字转换为字符串,在奇数位置和偶数位置创建数字列表(字符),然后通过列表的索引进行比较。这听起来效率太高或不易实现,因为它涉及从int到string的过多转换,反之亦然。优点是,这很容易解决数字奇数的问题。
有没有办法在不使用字符串的情况下解决这个问题?
谢谢。
答案 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')]
然后使用min
和join
组合来获取输出
答案 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]