プログラムを勉強しはじめたばかりの者です。
前提・実現したいこと
pythonを使って、最も深い階層のリストを、重複無く羅列したい。
やりたいことのイメージ
[α,β](α,βはint)という形の、2つの要素が入ったリストが、リストの一番小さい単位です。
これが例えば、
[[1,2][[[2,1][1,3]][4,2]][1,3]]
と並んでいるとします。この多層のリストからまず[α,β]の形だけを取り出して
[1,2][2,1][1,3][4,2][1,3]
として、さらにそこから重複(この場合は[1,3])を排除して
[1,2][2,1][1,3][4,2]
と出力したいです。
集合というものを使うのがいいのかなとも考えたのですが、集合の中にリストを入れて記述することが出来ませんでした。
解決方法を教えてもらえると助かります。よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
(前書き)「自分で書きたい」が質問の主旨なら、kilesaさんの回答のジェネレータと再帰がいいと思います。
データの最小単位が「2個の整数からなる組」だと固定するなら、その部分を可変長構造であるリストで持っておくのはコードの意味的に見通しがよくなく、そこはタプルで保持するのがいいと思います。
[(1,2),[[(2,1),(1,3)],(4,2)],(1,3)]
ですね。
そうすると再帰の終了条件も、リテラルの見え方もわかりやすくなるはずです。集合型も使えるようになります。
また、more-itertoolsのcollapseで楽に書けます。
python
1>>> from more_itertools import collapse 2>>> set(collapse([(1,2),[[(2,1),(1,3)],(4,2)],(1,3)], base_type=tuple)) 3{(1, 2), (1, 3), (2, 1), (4, 2)}
※集合型は順序を保持しないので、これがよいかは不明ですが
投稿2021/11/15 01:42
総合スコア11235
0
とりま、こんなんでどうでしょ?
python3
1def flattenToListsOfLength2(l): 2 for e in l: 3 if len(e) == 2 and not isinstance(e[0], list) and not isinstance(e[1], list): 4 yield e 5 else: 6 yield from flattenToListsOfLength2(e) 7 8 9if __name__ == '__main__': 10 lis0 = [[1,2], [[[2,1], [1,3]], [4,2]] ,[1,3] ] 11 12 lis1 = [*flattenToListsOfLength2(lis0)] 13 print(lis1) # => [[1, 2], [2, 1], [1, 3], [4, 2], [1, 3]] 14 15 result = [list(tpl) for tpl in set([*map(tuple, lis1)])] 16 print(result) # => [[1, 2], [1, 3], [2, 1], [4, 2]] 17 18
???? サンプル
投稿2021/11/15 00:23
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
sample
1ab = [[1,2],[2,1],[1,3],[4,2],[1,3]] 2 3def get_unique_list(seq): 4 seen = [] 5 return [x for x in seq if x not in seen and not seen.append(x)] 6 7print(get_unique_list(ab)) 8
[[1, 2], [2, 1], [1, 3], [4, 2]]
希望の形なっているかと思います。
下記URLを参考にしてみて下さい。
https://note.nkmk.me/python-list-unique-duplicate/
and演算子のショートサーキット(短絡評価)でX and YのXがFalseであればYは評価されない(実行されない)ことappend()メソッドがNoneを返すことを利用している。
元のリストseqの要素がseenに存在しない場合(x not in seenがTrue)、and以降のnot seen.append(x)が評価される。seen.append(x)が実行され、seenにその要素が追加される。append()メソッドがNoneを返し、NoneはFalseであるため、not seen.append(x)はTrueと評価される。リスト内包表記の条件式がTrueとなり、最終的に生成されるリストの要素として追加される。
元のリストseqの要素がseenに存在する場合は、x not in seenがFalseとなり、リスト内包表記の条件式がFalseとなるため、最終的に生成されるリストの要素として追加されない。
投稿2021/11/15 00:25
総合スコア109
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
[α,β](α,βはint)という形の、2つの要素が入ったリストが、リストの一番小さい単位です。
python
1def flatten_recursive(lst): 2 return (sum(map(flatten_recursive, lst), []) 3 if isinstance(lst, list) and isinstance(lst[0], list) 4 else [tuple(lst)]) 5 6if __name__ == '__main__': 7 lst = [[1, 2], [[[2, 1], [1, 3]], [4, 2]], [1, 3]] 8 flat_list = flatten_recursive(lst) 9 unique_flat_list = list(map(list, set(flat_list))) 10 print(unique_flat_list) 11 12 _ = ''' 13[[1, 2], [1, 3], [2, 1], [4, 2]] 14'''
投稿2021/11/15 00:25
編集2021/11/15 00:52総合スコア20655
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
入力データ次第ですが、示されたデータを処理するだけなら以下でできます。
python
1>>> org_list = [[1,2],[[[2,1],[1,3]],[4,2]],[1,3]] 2>>> 3>>> def push_end(tree, box): 4... if any(type(branch)!=list for branch in tree): 5... box.add(tuple(tree)) 6... else: 7... for branch in tree: 8... push_end(branch, box) 9... return [list(log) for log in box] 10... 11>>> print(push_end(org_list, set())) 12[[1, 2], [1, 3], [2, 1], [4, 2]]
投稿2021/11/15 00:05
総合スコア24670
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/11/15 01:52
2021/11/15 04:34