将两个数字与对应位置的整数合并在一起(不使用str)



假设我有两个整数:

a = 123
b = 4567

我想合并这些数字,保持每个位置对应的整数位置在一起。我的愿望最终数字是:

1425367

但是我不想使用str来实现这个.


这是我到目前为止写的代码。但它只是忽略了最后一个数字。

编辑:我知道我使用了str,但我不知道还有什么其他方法可以实现这个

def f(a,b):
sa, sb = list(str(a)), list(str(b))
i, j = 0, 0
s = ""
while i < len(sa) and j < len(sb):
s += sa[i]
s += sb[j]
i += 1
j += 1
return s
print(f(23,56))```

用f字符串代替str,用zip_longest组合两个字符串:

>>> from itertools import zip_longest
>>> int(''.join((x or "") + (y or "") for x, y in zip_longest(f"{a}", f"{b}")))
1425367

如果你有一些"no imports"一般来说,使用内置的zip并不难做到这一点,但是您需要对末尾数字进行特殊处理:

>>> int(''.join((x or "") + (y or "") for x, y in zip(f"{a}", f"{b}")) + f"{a}")[len(f"{b}"):] + f"{b}"[len(f"{a}"):]
1425367

试试这种方法,不要使用任何形式的stringfstrings。纯数值方法-

from itertools import zip_longest
def get_pos_nums(num):
pos_nums = []
while num != 0:
pos_nums.append((num % 10))
num = num // 10
return list(reversed(pos_nums))
zipped = zip_longest(get_pos_nums(a), get_pos_nums(b))
digits = [i for j in zipped for i in j if i!=None]
number = sum(d * 10**i for i, d in enumerate(digits[::-1]))
1425367
  1. 第一个函数通过除以10将数字分解为其位数
  2. Next zip_longest按提供的顺序压缩两个列表,如果其中一个字符串没有数字则返回None。
  3. 将此数字列表平放并删除none
  4. 将它们分别乘以10s的幂后与总和合并

这是我不使用string(或f-string)来实现这一点的方法:

  1. 创建一个函数将你的数字分割成整数列表
  2. 包含对应数字的两个整数合并列表
  3. 将列表中的数字乘以10以得到所需的最终数字

步骤1:将number拆分为整数列表

使用math.log10()创建自定义函数,从给定字符串

返回整数列表
from math import log10
def get_num_left_to_right(num):
n = int(log10(num))
for i in range(n, -1, -1):
fac = 10**i
x = num//fac
yield x
num -= x * fac

示例运行:

a, b = 123, 4567
x = list(get_num_left_to_right(a))
# where `x` holds:
# [1, 2, 3]
y = list(get_num_left_to_right(b))
# where `y` holds:
# [4, 5, 6, 7]

步骤2:将两个对应数字的列表合并在一起

我使用itertools.chainitertools.izip_longest以及列表推导来实现这一点。例如:

from itertools import izip_longest, chain
num_list = [x for x in chain(*izip_longest(x, y)) if x is not None]
# where `num_list` will hold:
# [1, 4, 2, 5, 3, 6, 7]

步骤3:将列表中的数字乘以10的幂

最后,我将列表中的数字乘以10**(length-i-1)以获得整数在最终数字

中的所需位置
num, length = 0, len(num_list)
for i, n in enumerate(num_list):
num += n*10**(length-i-1)
# where `num` will be holding:
# 14253670

相关内容

  • 没有找到相关文章

最新更新