簡體   English   中英

反轉 python 中的嵌套列表

[英]reversing a nested list in python

您好我正在嘗試以相反的順序轉換嵌套列表。

這是我的代碼:

def reverse_(items):
     items =  items[::-1]
        new_l = []
        for item in items:
            if type(item) == list:
                item.reverse()
                new_l.append(item)
            else:
                new_l.append(item)
        return new_l
  1. print(reverse_reversed([1, [2, 3, 4, 'yeah'], 5] ))返回: [5, ['yeah', 4, 3, 2], 1]這是正確的

  2. 但是print(reverse_reversed([42, [99, [17, [33, ['boo!']]]]])返回: [[[17, [33, ['boo,']]], 99], 42]應該是這樣的: [[[[['boo,'], 33], 17], 99], 42]

看起來您想要遞歸地反轉列表,而不僅僅是一次嵌套。 這意味着您需要進行遞歸 function 調用,即它需要調用自身。

def recursive_reversed(items):
    if isinstance(items, list):
        return [recursive_reversed(item) for item in reversed(items)]
    return items

筆記:

  1. 我使用isinstance檢查而不是type(item) == 這通常是您想要的,這意味着list的子類也將被反轉(盡管它們將是常規列表)。
  2. 沒有額外的副本: reversed以相反的順序迭代原始列表。
  3. 什么都沒有反轉:如果您在調用您的實現后查看原始列表的內容,您會看到它的子列表也將被反轉。
  4. 我使用了一個列表理解,它通常優於“創建一個空列表,循環遍歷其他內容,每次迭代都將某些內容附加到該列表”。
  5. 我的 function 稱自己為分而治之的形式。

這是因為你做了items[::-1] ,這使得列表最終像這樣[[99, [17, [33, ['boo,']]]], 42]正如你在你的列表只有兩個項目[99, [17, [33, ['boo!']]]]42 所以你新的如果列表中有更多列表,你將不得不檢查你是否正在迭代你的列表中沒有未反轉的列表。 但是你不能用一個簡單的 for 循環來做到這一點。

如果您實際上不需要反轉副本,而只想反轉結構本身:

def reverse(items):
    if isinstance(items, list):
        items.reverse()
        for item in items:
            reverse(item)

演示:

>>> a = [42, [99, [17, [33, ['boo!']]]]]
>>> reverse(a)
>>> a
[[[[['boo!'], 33], 17], 99], 42]

您也可以使用return items結束它以獲得返回的結果:

>>> reverse([42, [99, [17, [33, ['boo!']]]]])
[[[[['boo!'], 33], 17], 99], 42]

雖然修改和返回都有些不尋常,但有些人不會喜歡它。

暫無
暫無

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

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