假设我有两个整数:
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
试试这种方法,不要使用任何形式的string
或fstrings
。纯数值方法-
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
- 第一个函数通过除以10将数字分解为其位数
- Next zip_longest按提供的顺序压缩两个列表,如果其中一个字符串没有数字则返回None。
- 将此数字列表平放并删除none
- 将它们分别乘以10s的幂后与总和合并
这是我不使用string(或f-string)来实现这一点的方法:
- 创建一个函数将你的数字分割成整数列表
- 包含对应数字的两个整数合并列表
- 将列表中的数字乘以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.chain
和itertools.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