【问题标题】:More pythonic way of achieving decimal zip [duplicate]实现十进制zip的更多pythonic方式[重复]
【发布时间】:2017-11-24 19:07:37
【问题描述】:

给定两个数字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 的剩余数字,尽管在某些情况下不需要其中一个或两个数字。
  • 输入过大需要一些时间。

【问题讨论】:

    标签: python performance python-3.x


    【解决方案1】:

    你可以使用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=''))))
    

    【讨论】:

    • 最后的 int 转换,你很好
    【解决方案2】:

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

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

    代码的工作方式如下:我们使用zip_longest 将两个字符串压缩在一起,并使用fillvalues 以防其中一个可迭代对象被耗尽。然后对于每两个“数字”(或空字符串,以防字符串用完),我们将它们连接在一起,然后我们将所有这些 zip 组合连接在一起以获得结果。

    【讨论】:

    • str.join 的情况下,列表理解可能比生成器表达式更好。 :)
    猜你喜欢
    • 2019-11-22
    • 2013-12-30
    • 2018-10-06
    • 1970-01-01
    • 2011-05-14
    • 2019-01-15
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多