【问题标题】:Python reshape a list to multidimensional listPython将列表重塑为多维列表
【发布时间】:2019-02-01 10:11:59
【问题描述】:

我有一个在每个维度上都有不同长度的列表,如下所示:

list1=[[2,3,4],[1],[77,8,27,12],[25,15]]

我还有另一个具有相同数量元素的列表,例如:

list2=[a,b,c,d,e,f,g,h,i,j]

我想将我的 list2 重塑为 list1 并在 for 循环中一起处理两个列表。

【问题讨论】:

  • @abarnet,OP 不是在问相反的问题吗? "我想将我的 list2 重塑为 list1"
  • @sacul 哎呀;你是对的……重新开放。 (如果我错了,规范副本是this one。)
  • 您的list2 不是一个有效的列表,除非您已经有一堆名为aj 的变量,您没有向我们展示。这使得复制和粘贴您的示例以展示如何解决问题变得更加困难,因为如果不重写您的示例,任何解决方案都会引发NameError

标签: python python-3.x list multidimensional-array


【解决方案1】:

这是一种可爱的方式。

list1 = [[2,3,4],[1],[77,8,27,12],[25,15]]
list2 = list("abcdefghij")

list2_iterator = iter(list2)
list2_reshaped = [[next(list2_iterator) for _ in sublist] for sublist in list1]

print(list2_reshaped)

Out: [['a', 'b', 'c'], ['d'], ['e', 'f', 'g', 'h'], ['i', 'j']]

我不知道纯理解是否可能。

【讨论】:

  • 这个答案假设 OP 知道如何用zip 解决他的问题的后半部分,我不确定我们是否可以假设。另外,我认为islice 在这里可能比内心的理解更清楚。但是,很好地展示了如何与zip 分开执行此操作,而不是像我的回答那样纠缠于它。
  • 是的,我假设 OP 可以做到这一点,只是说明了重塑数据的动机。情况可能并非如此。但我不确定他们想以何种方式一起迭代它们(有几个明智的选择),所以如果没有来自 OP 的更多信息,我无法回答这个问题。
  • PS,你可以总是用纯推导式来做,但这并不总是一个好主意……将赋值塞入推导式(没有赋值表达式),只需在其他循环之外抛出一个 1 元素循环:[[next(list2_iterator) for _ in sublist] for list2_iterator in [iter(list2)] for sublist in list1]。显然远不及你现在所拥有的可读性。
  • 我怀疑这样的事情是可能的。是的,我想这几乎不是一个好主意。感谢您的洞察力。
【解决方案2】:

将 list1 展平以匹配 list2 很容易 — 只需使用 itertools.chain.from_iterable(list))flat1 = [elem for sublist in list1 for elem in sublist] 或其他各种选项 in this question

走另一条路有点复杂。但是,与其寻找单线,不如明确地去做:在list2 上创建一个迭代器,并根据需要从中提取元素:

def zipstructured(list1, list2):
    iter2 = iter(list2)
    for sublist1 in list1:
        sublist2 = list(itertools.islice(iter2, len(sublist1)))
        yield sublist1, sublist2

现在你可以这样做了:

>>> list1=[[2,3,4],[1],[77,8,27,12],[25,15]]
>>> list2=['a','b','c','d','e','f','g','h','i','j']
>>> for sub1, sub2 in zipstructured(list1, list2):
...     print(sub1, sub2)
[2, 3, 4] ['a', 'b', 'c']
[1] ['d']
[77, 8, 27, 12] ['e', 'f', 'g', 'h']
[25, 15] ['i', 'j']

【讨论】:

    【解决方案3】:

    如果你想循环处理它们,你可以这样做:

    list1=[[2,3,4],[1],[77,8,27,12],[25,15]]
    
    list2=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
    
    last = 0
    
    for ele in list1:
        print(ele, list2[last : last + len(ele)])
        last += len(ele)
    

    结果:

    ([2, 3, 4], ['a', 'b', 'c'])
    ([1], ['d'])
    ([77, 8, 27, 12], ['e', 'f', 'g', 'h'])
    ([25, 15], ['i', 'j'])
    

    【讨论】:

      猜你喜欢
      • 2023-02-19
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2016-05-27
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多