【问题标题】:python combine two arrays by the key columnpython通过键列组合两个数组
【发布时间】:2014-10-01 06:10:42
【问题描述】:

我有两个数组,例如:

a = [['a', '11', '111'],['b','22','222'],['a','33','333'],['b','44','444']]
b = [['a','0.1','1'],['b','0.9','0']]

我想根据第一列合并 a 和 b 并得到如下结果:

[['a', '11', '111', '0.1', '1'], ['b', '22', '222', '0.9', '0'], ['a','33','333', '0.1', '1'], ['b','44','444', '0.9', '0']]

我将数组b 作为字典并循环a 中的每一行,并通过从字典b 中获取的值扩展该行。有没有人有优雅的方法来做到这一点?

【问题讨论】:

  • 你的根本解决方案是我会怎么做。您是在实现方面遇到问题,还是只是在询问是否有更好的算法方法(没有)?

标签: arrays python-2.7


【解决方案1】:

使用pandas,你可以使用pandas.merge获得结果:

In [72]: a = [['a', '11', '111'],['b','22','222'],['a','33','333'],['b','44','444']]

In [73]: b = [['a','0.1','1'],['b','0.9','0']]

In [74]: import pandas as pd

In [75]: a = pd.DataFrame(a, columns=('key', 'col1', 'col2'))

In [76]: b = pd.DataFrame(b, columns=('key', 'col3', 'col4'))

In [77]: df = pd.merge(a, b, on=['key']); df
Out[77]: 
  key col1 col2 col3 col4
0   a   11  111  0.1    1
1   a   33  333  0.1    1
2   b   22  222  0.9    0
3   b   44  444  0.9    0

In [81]: df.values.tolist()
Out[84]: 
[['a', '11', '111', '0.1', '1'],
 ['a', '33', '333', '0.1', '1'],
 ['b', '22', '222', '0.9', '0'],
 ['b', '44', '444', '0.9', '0']]

【讨论】:

    【解决方案2】:

    您提出的方法已经足够优雅了:

    >>> a = [['a', '11', '111'],['b','22','222'],['a','33','333'],['b','44','444']]
    >>> b = [['a','0.1','1'],['b','0.9','0']]
    >>> b_ex = dict([(l[0], l[1:]) for l in b])
    >>> [x+b_ex[x[0]] for x in a]
    [['a', '11', '111', '0.1', '1'], ['b', '22', '222', '0.9', '0'], ['a', '33', '333', '0.1', '1'], ['b', '44', '444', '0.9', '0']]
    

    【讨论】:

      【解决方案3】:

      简单,使用嵌套列表推导:

      >>> [a1 + [b1[1:] for b1 in b if b1[0] == a1[0]][0] for a1 in a]
      [['a', '11', '111', '0.1', '1'], 
       ['b', '22', '222', '0.9', '0'], 
       ['a', '33', '333', '0.1', '1'], 
       ['b', '44', '444', '0.9', '0']]
      

      【讨论】:

        【解决方案4】:

        看起来如何:[(x+b[x[0]]) for x in a]

        详情:

        >>> a = [['a', '11', '111'], ['b', '22', '222'], ['a', '33', '333'], ['b', '44', '444']]
        >>> b = {'a': ['0.1', '1'], 'b': ['0.9', '0']}
        >>> [(x+b[x[0]]) for x in a]
        [['a', '11', '111', '0.1', '1'], ['b', '22', '222', '0.9', '0'], ['a', '33', '333', '0.1', '1'], ['b', '44', '444', '0.9', '0']]
        >>> 
        

        【讨论】:

        • b 是一个列表 - 不是一个字典。
        • 他说他让 b 成为一个 dict。 “我把数组 b 作为字典”
        • 然后他要求一个更优雅的解决方案。不让任何人重复他的一半。
        猜你喜欢
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多