更多pythonic方式实现十进制zip

时间:2017-06-21 18:23:36

标签: python performance python-3.x

给定两个数字ab,十进制zip的定义如下所述:

•C的第一个(即最重要的)数字是a的第一个数字;

•C的第二个数字是b;

的第一个数字

•C的第三个数字是a;

的第二个数字

•C的第四个数字是b的第二个数字;

•等。

如果其中一个整数ab用完了数字,则其余数字为  另一个整数被附加到结果中。

示例:

输入: a = 12,b = 59 输出应为: c = 1529

输入: a = 1094,b = 12 输出: c = 110294

我有这段代码:

a = 1234534543
b = 3525523342

a = str(a)
b = str(b)
aLen = len(a)
bLen = len(b)

c = "".join([x+y for (x,y) in zip(a,b)]) + a[min(aLen,bLen):] + b[min(aLen,bLen):]
print(int(c))

它有效,但有更多的pythonic方法来实现同样的目标吗?

以上代码的问题是:

  • 我正在尝试附加ab的其余数字,但在某些情况下,其中一个或两个都不是必需的。
  • 输入太大需要一些时间。

2 个答案:

答案 0 :(得分:4)

您可以使用itertools.zip_longest

from itertools import zip_longest
c = "".join([x+y for (x,y) in zip_longest(str(a), str(b), fillvalue='')])

如果您不喜欢x+y,还有itertools.chain会使可迭代变得扁平化:

from itertools import chain
c = "".join(chain.from_iterable(zip_longest(a,b, fillvalue='')))

您也可以将其包含在int内,以便在一行中完成所有操作:

c = int("".join(chain.from_iterable(zip_longest(a,b, fillvalue=''))))

答案 1 :(得分:4)

是的,您可以使用以下oneliner:

from itertools import zip_longest

c = ''.join([x+y for x,y in zip_longest(str(a),str(b),fillvalue='')])

代码的工作原理如下:我们使用zip_longest将两个字符串压缩在一起,并且我们使用fillvalue来防止其中一个迭代用尽。然后对于每两个“数字”(或者在字符串耗尽的情况下为空字符串),我们将它们连接在一起,然后我们将zip的所有组合连接在一起以获得结果。