【问题标题】:Combine two list of tuples depending on name根据名称组合两个元组列表
【发布时间】:2021-11-07 15:07:19
【问题描述】:

我有两个元组列表:

a=[(name_2,array_2),(name_7,array_7),...,(name_n,array_n)]
b=[(name_3,arr_3),(name_12,arr_12),...,(name_n,arr_n)]

我想根据它们的名称组合它们,这是每个集合中每个元组的第一个值。列表不按名称排序。结果应如下所示:

combined=[(name_1,array_1,arr_1),(name_2,array_2,arr_2),...,(name_n,array_n,arr_n)]

有没有比用两个指针迭代更有效的解决方案?

【问题讨论】:

    标签: python list numpy


    【解决方案1】:
    sorted_a = sorted(a, key=lambda x: x[0])
    sorted_b = sorted(b, key=lambda x: x[0])
    
    combined = [(sorted_a[idx][0], sorted_a[idx][1], sorted_b[idx][1]) for idx in range(len(a))]
    

    【讨论】:

    • 感谢您的方法,但我认为您的解决方案要求我的两个列表按名称排序,事实并非如此。抱歉,我创建了这些令人困惑的示例。我会编辑那个。或者是否有一种简单的方法可以按它们继承的名称对两个元组列表进行排序。
    • 是的,有:sorted_a = sorted(a, key=lambda x: x[0])。但是如果 a 和 b 有不同的长度(或不同的名称集),仅仅对它们进行排序是不够的
    • 不,它们的长度相同。它始终是一对训练和真值数组。
    • @SergeantIdiot 好的,编辑答案
    【解决方案2】:

    我假设这两个列表具有相同数量的元素并且名称的顺序相同(从您的示例中看起来)。那样的话

    [(x[0], x[1], y[1]) for x, y in zip(a, b)]
    

    【讨论】:

      【解决方案3】:

      由于您说它们是成对的,因此这里的大多数答案都很好,您只需在将它们连接在一起之前对元组中的第一项进行排序。

      [(x[0], x[1], y[1]) for x, y in zip(sorted(a, key=lambda x: x[0]),
                                          sorted(b, key=lambda x: x[0]))]
      

      【讨论】:

        【解决方案4】:

        避免排序的解决方案是通过字典:

        names = [x[0] for x in a]
        ad = dict(a)
        bd = dict(b)
        combined = list({k: [ad[k], bd[k]] for k in names}.items())
        

        在我的机器上,向量 ab 的大小为 1000,当对两个数组进行排序时,这需要 384 us 而不是 667 us。注意:最终的combined 列表未排序。

        【讨论】:

          【解决方案5】:

          pandas

          list(pd.concat([pd.DataFrame(a).set_index(0) for x in (a , b)],axis=1).reset_index().itertuples(index=False,name=None))
          [('name_1', 'array_1', 'array_1'), ('name_2', 'array_2', 'array_2')]
          

          【讨论】:

            猜你喜欢
            • 2013-09-17
            • 2013-09-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-12
            • 2023-01-28
            • 1970-01-01
            • 1970-01-01
            • 2013-09-03
            相关资源
            最近更新 更多