【问题标题】:Combining two multi-dimensional arrays [closed]组合两个多维数组
【发布时间】:2020-04-06 10:15:59
【问题描述】:

在 Python 中有这两个数组:

a = [ ['a',1], ['b',2], ['c',3] ]
b = [ ['a',10], ['b',20], ['c',30], ['d',40] ]

是否可以像这样将它们组合成一个数组?

output = [ ['a',1,10], ['b',2,20], ['b',3,30], ['c',0,40] ]

由于第一个数组中不存在'c',所以第一个整数应该是0。

谢谢。

【问题讨论】:

  • 仅缺少 last 值?例如,不是从列表的开头或中间开始?
  • @AndrejKesely 是的,它可以来自任何地方。
  • @AndrejKesely 您删除的答案是正确的。谢谢!!
  • @FilipeYaBaPolido 不,不是。缺少['b', 2, 20] 值...
  • @AndrejKesely 这很奇怪,可能错过了,让我再对照我的原始数组检查这里。

标签: python arrays multidimensional-array


【解决方案1】:

如 cmets 中所述,如果缺失值可以在任何位置,则不能使用 zipzip_longest。在这里,我使用 dicts 来连接值:

a = [ ['a',1],  ['b',2],  ['c',3]            ]
b = [ ['a',10], ['b',20], ['c',30], ['d',40] ]

d1, d2 = dict(a), dict(b)

d = {k: [d1.get(k, 0), d2.get(k, 0)] for k in d1.keys() | d2.keys()}

print( sorted([k, *v] for k, v in d.items()) )  # use custom key= to sort them to right order (or don't use sort if you don't need it)

打印:

[['a', 1, 10], ['b', 2, 20], ['c', 3, 30], ['d', 0, 40]]

【讨论】:

    【解决方案2】:

    在我看来,为您的数据类型选择字典比列表更有意义,但如果您需要使用列表,这是一种方法:

    • 原始列表中的列表实际上只是元组,将键与值匹配;字典在这里更有意义
    • 您希望原始列表中每个键的结果都有一个列表
    • 结果列表中的列表实际上只是 3 元组,将键与第一个和第二个值匹配
    • 您希望每个键的第一个列表中的值(如果没有,则为 0)作为第一个值
    • 您希望每个键的第一个列表中的值(如果没有,则为 0)作为第二个值
    da = {l[0]: l[1] for l in a}
    db = {l[0]: l[1] for l in b}
    
    result = [
        [k, da[k] if k in da else 0, db[k] if k in db else 0]
        for k in sorted(set(list(da.keys()) + list(db.keys())))
    ]
    
    print(result)
    

    请注意,sorted() 在那里是为了保持秩序。如果不能保证字母顺序,您可以使用以下方法组合键和重复数据删除:

    def dedupe(seq):
        seen = set()
        seen_add = seen.add
        return [x for x in seq if not (x in seen or seen_add(x))]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多