質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

5回答

1760閲覧

pythonを使って、最も深い階層のリストを、重複無く羅列したい。

sk_zappa

総合スコア5

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/14 23:10

プログラムを勉強しはじめたばかりの者です。

前提・実現したいこと

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

(前書き)「自分で書きたい」が質問の主旨なら、kilesaさんの回答のジェネレータと再帰がいいと思います。


データの最小単位が「2個の整数からなる組」だと固定するなら、その部分を可変長構造であるリストで持っておくのはコードの意味的に見通しがよくなく、そこはタプルで保持するのがいいと思います。

[(1,2),[[(2,1),(1,3)],(4,2)],(1,3)]

ですね。
そうすると再帰の終了条件も、リテラルの見え方もわかりやすくなるはずです。集合型も使えるようになります
また、more-itertoolscollapseで楽に書けます。

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

quickquip

総合スコア11235

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/15 01:52

more-itertools は初めて知りました。勉強になります ????
sk_zappa

2021/11/15 04:34

皆様早々にご回答頂きまして誠にありがとうございました。 どれも試してみたら自分の求めるような結果が出てきました、本当に助かります。 今回のような場合にデータの最小単位をタプルにするというのは、やり方として非常に参考になり、目からウロコでした。そのためquickquipさんの回答をベストアンサーに致しました。ですがどのご回答も参考になりました、ありがとうございました。
guest

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

ekTJ

総合スコア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
melian

総合スコア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

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問