1. ホーム
  2. python

Pythonの入れ子リスト

2022-02-14 22:50:51
<パス

プロジェクトのgithubアドレスです。 bitcarmanlee イージーアルゴリズムインタビューと実践
スターへようこそ、コメントを残して、一緒に学び、進歩しましょう。

1. ネストされたリストの反復処理

ネストされたリストをトラバースして出力することはよくある要件である。これは次の2つの方法で実現される。

def nested_list(list_raw,result):
    for item in list_raw:
        if isinstance(item, list):
            nested_list(item,result)
        else:
            result.append(item)
            
    return result   
            
def flatten_list(nested):
    if isinstance(nested, list):
        for sublist in nested:
            for item in flatten_list(sublist):
                yield item
    else:
        yield nested
    
def main():   
    list_raw = ["a",["b","c",["d"]]
    result = []
    print "nested_list is: ",nested_list(list_raw,result)
    print "flatten_list is: ",list(flatten_list(list_raw))
    
main()


コードを実行させると、次のような出力が得られます。

nested_list is: ['a', 'b', 'c', 'd']
flatten_list is: ['a', 'b', 'c', 'd']



nested_list メソッドは再帰を使用し、アイテムがリスト型である場合、再帰的に自分自身を呼び続けます。そうでない場合は、単に結果リストに項目を追加します。
flatten_listメソッドはジェネレータアプローチを採用していますが、これは基本的に再帰の考え方と同じです。

2. 2レベルのネストしたリストの重複排除

リストの中にリストがネストしており、重複を排除し、重複排除されたリストを生成する必要があります。

def dup_remove_set(list_raw):
    result = set()
    for sublist in list_raw:
        item = set(sublist)
        result = result.union(item)
    return list(result)

def main():  
    list_dup = [[1,2,3],[1,2,4,5],[5,6,7]]
    print dup_remove_set(list_dup)


コードを実行させます。

[1, 2, 3, 4, 5, 6, 7]


基本的な考え方:各サブリストをセットに変え、そしてそれをマージする。

3. 複数ネストの重複排除

def dup_remove(list_raw,result):
    for item in list_raw:
        if isinstance(item, list):
            dup_remove(item,result)
        else:
            result.add(item)
            
    return list(result)

def main():   
    list_raw = ["a",["b","c",["d","a","b"]]
    result = set()
    print "dup_remove is: ",dup_remove(list_raw,result)


コードを実行させます。

dup_remove is: ['a', 'c', 'b', 'd']


基本的な考え方は先ほどのネストしたリストをトラバースするものと似ていますが、唯一違うのは結果がリストであること、そして重みを取り除くために結果がセットであることで、最終結果が取り除いた結果であることを保証しています。