【问题标题】:Best way to merge a 2d list and a 1d list in Python?在 Python 中合并 2d 列表和 1d 列表的最佳方法?
【发布时间】:2016-05-14 02:07:50
【问题描述】:

我需要在不丢失元素的情况下合并二维列表和一维列表。

我使用循环来实现结果,但我想知道是否有更好的方法。

list1 = ["a","b","c","d"]
list2 = [["1","2","3"],["4","5","6"],["7","8"]]
max_column_count = len(list1)
expected_result = [list1]
for row in list2:
    if max_column_count > len(row):
        columns = max_column_count - len(row)
        row += [''] * columns
    expected_result.append(row)
print(expected_result)

输出

[['a', 'b', 'c', 'd'], ['1', '2', '3', ''], ['4', '5', '6', ''], ['7', '8', '', '']]

【问题讨论】:

  • 这是您的预期输出吗?...如果不是。发布它
  • 请指定预期的输入和输出?
  • 上面的代码已经在做这个工作了,所以输出是输出和预期的输出。我的问题是是否有更好/最好的方法。

标签: python list merge


【解决方案1】:

如果您发布的输出是您的预期输出,那么使用来自itertoolschain 将是一种方法:

>>> mx_len = len(max([list1,*list2]))
>>> 
>>> mx_len
4
>>> [x+['']*(mx_len-len(x)) for x in itertools.chain([list1], list2)]
[['a', 'b', 'c', 'd'], ['1', '2', '3', ''], ['4', '5', '6', ''], ['7', '8', '', '']]
>>>
>>> #another way by unpacking list2 in a list with list1
>>>
>>> [x+['']*(mx_len-len(x)) for x in itertools.chain([list1, *list2])]
[['a', 'b', 'c', 'd'], ['1', '2', '3', ''], ['4', '5', '6', ''], ['7', '8', '', '']]

另一种方法是 双压缩 效果,例如使用 zip_longest 转置两个列表并使用 '' 填充缺失值,然后再次压缩列表以恢复原始形状,这方式:

>>> l1 = itertools.zip_longest(list1, *list2, fillvalue='')
>>> 
>>> l2 = list(zip(*l1))
>>>
>>> l2
[('a', 'b', 'c', 'd'), ('1', '2', '3', ''), ('4', '5', '6', ''), ('7', '8', '', '')]

【讨论】:

  • 我知道 zip_longest 会这样做,但我不知道该怎么做。非常感谢!
  • @SinanÇetinkaya .. 当然 ..:)
  • @IronFist 性能怎么样,哪个性能更快更高效?
【解决方案2】:
>>> list1 = ["a","b","c","d"]
... list2 = [["1","2","3"],["4","5","6"],["7","8"]]
... list3 = [list1] + map(lambda x: x + ['']*(len(list1)-len(x)),list2)
>>> list3
6: [['a', 'b', 'c', 'd'],
 ['1', '2', '3', ''],
 ['4', '5', '6', ''],
 ['7', '8', '', '']]
>>> 

这与您所做的基本相同,但更简洁。如果你不了解地图功能,这是学习的好时机(https://docs.python.org/3/library/functions.html#map

【讨论】:

    【解决方案3】:

    如果您希望结果列表包含相同大小的列表,并填充空字符串:

    list1 = ["a","b","c","d"]
    list2 = [["1","2","3"],["4","5","6"],["7","8"]]
    req_len = len(list1)
    result = [list1] + [org + [''*(req_len - len(org))] for org in list2]
    print result
    

    【讨论】:

      【解决方案4】:
      list1 = ["a","b","c","d"]
      list2 = [["1","2","3"],["4","5","6"],["7","8"]]
      list3 = []
      list3.append(list1)
      list3.append(list2)
      >>>
      list3 =[['a', 'b', 'c', 'd'], [['1', '2', '3'], ['4', '5', '6'], ['7', '8']]]
      

      【讨论】:

      • 一点解释会让您的贡献更有价值,并且符合 StackOverflow 发布答案的指南(请参阅帮助中心)...
      猜你喜欢
      • 2019-06-27
      • 2022-01-13
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 2022-11-03
      • 1970-01-01
      相关资源
      最近更新 更多