RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 903584
Accepted
Antoxer
Antoxer
Asked:2020-11-08 01:05:48 +0000 UTC2020-11-08 01:05:48 +0000 UTC 2020-11-08 01:05:48 +0000 UTC

按元素添加不同长度的列表

  • 772

有两个列表:

a = [1,2,3]
b = [4,5,6,7,8]

你需要得到这个结果:

a + b = [5,7,9,7,8]

我希望意思很清楚。只是我脑子里有些拐杖,我想找到一个或多或少足够的解决方案。

python
  • 5 5 个回答
  • 10 Views

5 个回答

  • Voted
  1. Sergey Gornostaev
    2020-11-08T01:09:26Z2020-11-08T01:09:26Z
    from itertools import zip_longest
    
    c = [sum(i) for i in zip_longest(a, b, fillvalue=0)]
    
    • 10
  2. Best Answer
    MaxU - stop genocide of UA
    2020-11-08T13:31:14Z2020-11-08T13:31:14Z

    还有几个解决方案:

    longer = a if len(a) >= len(b) else b
    c = [x+y for x,y in zip(a,b)] + longer[min(len(a), len(b)):]
    

    或一个命令(可读性较差的版本):

    c = [x+y for x,y in zip(a,b)] + (a if len(a) >= len(b) else b)[min(len(a), len(b)):]
    

    长度约为 的数组的执行时间测量10^6:

    In [110]: print(len(a), len(b))
    1000000 1012345
    
    In [104]: %timeit Sergey_Gornostaev(a, b)
    267 ms ± 318 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    In [105]: %timeit nick_gabpe(a, b)
    200 ms ± 168 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    In [106]: %timeit AtachiShadow1(a, b)
    255 ms ± 558 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    In [107]: %timeit AtachiShadow2(a, b)
    239 ms ± 1.69 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    In [108]: %timeit AtachiShadow3(a, b)
    200 ms ± 604 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    In [109]: %timeit MaxU(a, b)
    124 ms ± 1.26 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    

    设置:

    from random import randint
    a = [randint(0, 10**6) for _ in range(10**6)]
    b = [randint(0, 10**6) for _ in range(10**6+12345)]
    
    print(len(a), len(b))
    # 1000000 1012345
    
    def MaxU(a, b):
        return [x+y for x,y in zip(a,b)] + (a if len(a) >= len(b) else b)[min(len(a), len(b)):]
    
    def nick_gabpe(a, b):
        c=[]
        for x, y in zip(a,b): 
           c+=[x+y]
    
        if len(a) > len(b):
           c+=a[len(a)-len(b)+1:]
        elif len(a) < len(b):
           c+=b[len(b)-len(a)+1:]
        return c
    
    def Sergey_Gornostaev(a, b):
        return [sum(i) for i in zip_longest(a, b, fillvalue=0)]
    
    def AtachiShadow1(a, b):
        c = []
        la = len(a)
        lb = len(b)
        maxab = max(la, lb)
        minab = min(la, lb)
        for i in range(maxab):
            if i >= minab:
                if la < lb:
                    c.append(0+b[i])
                elif la > lb:
                    c.append(a[i]+0)
            else:
                c.append(a[i]+b[i])
        return c
    
    def AtachiShadow2(a, b):
        c = []
        la = len(a)
        lb = len(b)
        maxab = max(la, lb)
        minab = min(la, lb)
        for i in range(maxab):
            try:
                c.append(a[i]+b[i])
            except IndexError:
                if la < lb:
                    c.append(0+b[i])
                elif la > lb:
                    c.append(a[i]+0)
        return c
    
    def AtachiShadow3(a, b):
        c=[]
        la = len(a)
        lb = len(b)
        for x, y in zip(a,b):
           c+=[x+y]
        if la > lb:
           c+=a[la-lb+1:]
        elif la < lb:
           c+=b[lb-la+1:]
        return c
    
    • 6
  3. AtachiShadow
    2020-11-08T03:53:35Z2020-11-08T03:53:35Z

    非常感谢作者完成了一项相当酷的任务,我(作为初学者)弄清楚它是如何工作的非常有趣)消息很长,但我希望它易于阅读))):

    在评论zip和答案中建议,zip_longest我决定将它留给最后一个选项,然后在他们尝试自己解决这个问题之前。这就是我所做的。第一个选项是:

    a = [1, 2, 3]
    b = [4, 5, 6, 7, 8]
    c = []
    
    for i in range(max(len(a), len(b))):
        if i >= min(len(a), len(b)):
            if len(a) == i + 1 and len(a) < len(b):
                c.append(0 + b[i])
            else:
                c.append(a[i] + 0)
        else:
            c.append(a[i] + b[i])
    print(c)
    

    他当然会做他必须做的事。但是我又想到了一个更合乎逻辑(在我看来)的解决方案来解决这个循环。第二个选项是:

    a = [1, 2, 3]
    b = [4, 5, 6, 7, 8]
    c = []
    for i in range(max(len(a), len(b))):
        try:
            c.append(a[i] + b[i])
        except IndexError:
            if i >= min(len(a), len(b)):
                if len(a) == i + 1 and len(a) < len(b):
                    c.append(0 + bbb[i])
                else:
                    c.append(a[i] + 0)
    print(c)
    

    一方面,在我看来,直到较小的列表停止迭代,主体才会被执行try:。并且当较小的列表结束时,except IndexError将引发并执行错误主体。由于此选项也符合预期,因此在执行速度方面比较它们是合乎逻辑的。我使用timeit并得到以下结果:

    Вариант №1 - 8.045603216 на 1000000 (1млн) повторений
    Вариант №2 - 9.076056240 на 1000000 (1млн) повторений
    

    我很惊讶。我希望它能try:消除循环内不必要if的执行,从而加快速度。但结果恰恰相反。之后,我决定将我的选项与 Sergey Gornostaev 的选项进行比较,并timeit第二次指出我的方法效率低下:

    Вариант №1 - 8.045603216 на 1000000 (1млн) повторений
    Вариант №2 - 9.076056240 на 1000000 (1млн) повторений
    Sergey Gornostaev - 6.960991073 на 1000000 (1млн) повторений
    

    再次证实了在stackoverflow上最常提供“经验丰富”的答案的想法))))谢尔盖·戈尔诺斯塔耶夫(Sergey Gornostaev)赢得了1秒))但我认为,标准库==优化代码。我去优化我的代码 - 在我的选项中,函数len(), max(), min()在循环的每次迭代中启动,但为什么我len(a)要问 5 次?))))我还认为这有点愚蠢,需要修复)) )) 将它们移到循环之前的变量并更正了逻辑if。

    选项编号 1.1:

    a = [1, 2, 3]
    b = [4, 5, 6, 7, 8]
    c = []
    la = len(a)
    lb = len(b)
    maxab = max(la, lb)
    minab = min(la, lb)
    for i in range(maxab):
        if i >= minab:
            if la < lb:
                c.append(0+b[i])
            elif la > lb:
                c.append(a[i]+0)
        else:
            c.append(a[i]+b[i])
    print(c)
    

    选项编号 2.1:

    a = [1, 2, 3]
    b = [4, 5, 6, 7, 8]
    c = []
    la = len(a)
    lb = len(b)
    maxab = max(la, lb)
    minab = min(la, lb)
    for i in range(maxab):
        try:
            c.append(a[i]+b[i])
        except IndexError:
            if la < lb:
                c.append(0+b[i])
            elif la > lb:
                c.append(a[i]+0)
    print(c)
    

    是的,优化工作:

    Вариант №1.1 - 4.774997384 на 1000000 (1млн) повторений
    Вариант №2.1 - 5.907061396 на 1000000 (1млн) повторений
    Sergey Gornostaev - 6.960991073 на 1000000 (1млн) повторений
    

    由于代码的正确编写,速度几乎提高了两倍。并且这两个选项都比建议的库更快)))

    当我正要对我的答案进行另一次编辑时,作者的答案出现了:

    a = [1,2,3]
    b = [4,5,6,7,8]
    c=[]
    for x, y in zip(a,b): 
       c+=[x+y]
    
    if len(a) > len(b):
       c+=a[len(a)-len(b)+1:]
    elif len(a) < len(b):
       c+=b[len(b)-len(a)+1:]
    print(c)
    

    什么timeit?粉碎,所有以前的选项))):

    Вариант №1.1 - 4.774997384 на 1000000 (1млн) повторений
    Вариант №2.1 - 5.907061396 на 1000000 (1млн) повторений
    Sergey Gornostaev - 6.960991073 на 1000000 (1млн) повторений
    Автор - 3.151485595 на 1000000 (1млн) повторений
    

    在我的“快速”优化版本之前获得 1.5 秒的增益。在一个问题中第二次很好地回答 CO 的想法得到了证实))))))

    但!在作者自己的答案中更酷的是使用zip. 在 Sergey Gornostaev 的回答和我的变体中,使用了更大列表的概念,也就是说,for它会执行与更大列表中的元素一样多的循环 - 这很糟糕。一个主要问题 - 如果其中一个列表为空会发生什么?这就是:

    a = []
    Вариант №1.1 - 4.960243867 на 1000000 (1млн) повторений
    Вариант №2.1 - 7.668313717 на 1000000 (1млн) повторений
    Sergey Gornostaev - 6.865756772 на 1000000 (1млн) повторений
    Автор - 1.848900008 на 1000000 (1млн) повторений
    

    什么转折!!!选项 1.1 保持不变(每个错误 0.2)。但是变体 #2.1 ( try except) 完全失败了 - 由于 ,现在a = []每次迭代都会for导致except,这增加了执行时间。与 1.1 一样,Sergey Gornostaev 变体的执行时间没有改变(每个错误 0.1)。但是作者的回答表现得淋漓尽致,它比任何“一杯糖”都要酷(来自关于“这是一个转弯”的漫画)))))在“长名单”的最快版本上几乎是3倍的优势!但这还不是全部!)))我记得стандартная библиотека == оптимизированный код,但作者的代码没有优化一点))))函数len(a),len(b)每次执行被调用两次。所以它们可以在开始时计算一次,然后使用变量)):

    a = [1,2,3]
    b = [4,5,6,7,8]
    c=[]
    la = len(a)
    lb = len(b)
    for x, y in zip(a,b):
       c+=[x+y]
    if la > lb:
       c+=a[la-lb+1:]
    elif la < lb:
       c+=b[lb-la+1:]
    

    这就是它所说的timeit:

    a = [1,2,3]:
    не оптимизированный код автора - 3.138068215
    оптимизированный код автора - 2.908475165
    
    a = []:
    не оптимизированный код автора - 1.909198691
    оптимизированный код автора - 1.642370166
    

    优化代码的增益为 0.25 秒。这已经是“长列表”代码的 3 倍优势!这很棒))))

    附言

    1.所有测量都是在同一台电脑上进行的,并且在大致相同的条件下(只有旁边打开的Chrome会有所不同),因此不同逻辑执行的时间比例在不同的计算机上会有所不同计算机,这里只显示了逻辑执行的近似相对速度。

    2.我不是专业人士,甚至不是业余爱好者,timeit我在写答案时正在谷歌搜索。到目前为止,“脚本小子”的概念更适用于我,但我正在学习)))))这就是为什么,我认为我对这个问答的研究将包含错误和不准确之处。如果更有经验的程序员告诉我他们,我会很高兴))))。

    3.再次非常感谢问题任务的作者以及那些回答和评论它的人,我很高兴对我的失败感到惊讶,并且从中学习也很高兴))

    4.给定的测量值和每 100 万次重复的差异可能会引发一个合乎逻辑的问题,即是否值得进行蒸汽浴,因为差异如此之小,尤其是因为我们谈论的是 Python 而不是 C++。而且我认为每个人都会自己决定是否值得))))))))至少对于热身来说,这是可以做到的)

    • 4
  4. nick_gabpe
    2020-11-08T02:41:21Z2020-11-08T02:41:21Z

    好吧,让我们编写我们的自行车:

    a = [1,2,3]
    b = [4,5,6,7,8]
    c=[]
    for x, y in zip(a,b): 
       c+=[x+y]
    
    if len(a) > len(b):
       c+=a[len(a)-len(b)+1:]
    elif len(a) < len(b):
       c+=b[len(b)-len(a)+1:]
    
    print(c) # [5, 7, 9, 6, 7, 8]
    
    • 3
  5. Илья
    2020-04-11T02:26:52Z2020-04-11T02:26:52Z

    但是选项,可能不是最快的,而是最短的:

    a = [1,2,3]
    b = [4,5,6,7,8]
    ml = min(len(a), len(b))
    с = [x + y for x, y in zip(a,b)] + a[ml:] + b[ml:]
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5