簡體   English   中英

有效地將平面列表切成多層嵌套列表

[英]Slicing flat list into multi-level nested list efficiently

例如,我有一個簡單的清單

 [1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G']

我想將其轉換為4深列表

[[[[1, 2], [3, 4]], [[5, 6], [7, 8]]], [[[9, 'A'], ['B', 'C']], [['D', 'E'] ['F', 'G']]]]

有沒有一種方法可以為每個級別創建一個單獨的變量? 什么是最節省內存和性能的方法?

更新:另外,有沒有辦法以非對稱的方式做到這一點?

[[[[1, 2, 3], 4], [[5, 6, 7], 8]]], [[[9, 'A', 'B'], 'C']], [['D', 'E', 'F'], 'G']]]]

請注意,您的第一個列表包含15個元素而不是16個元素。此外, A應該是什么? 您在其他地方定義的常數嗎? 我只是假設它是一個字符串: 'A'

如果你有工作np.arrays ,你可以簡單地重塑你的數組:

import numpy as np
r = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G'])
r.reshape(2,2,2,2)

它輸出:

array([[[['1', '2'],
         ['3', '4']],

        [['5', '6'],
         ['7', '8']]]


       [[['9', 'A'],
         ['B', 'C']],

        [['D', 'E'],
         ['F', 'G']]]
      dtype='<U11')

這應該非常有效,因為numpy不會更改基礎數據格式。 它仍然是平面陣列,顯示方式不同。

Numpy不支持不規則形狀。 然后,您必須使用標准的python列表:

i = iter([1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G'])

l1 = []

for _ in range(2):
    l2 = []
    for _ in range(2):
        l3 = []
        l4 = []
        for _ in range(3):
            l4.append(next(i))
        l3.append(l4)
        l3.append(next(i))
        l2.append(l3)
    l1.append(l2)

print(l1)
# [[[[1, 2, 3], 4], [[5, 6, 7], 8]], [[[9, 'A', 'B'], 'C'], [['D', 'E', 'F'], 'G']]]

如您所說,您必須為每個級別定義一個臨時變量。 我想您可以使用列表推導,但是它們並不漂亮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM