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

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

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

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

Q&A

解決済

2回答

334閲覧

4重の内包表記を書きたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2018/02/07 07:12

4重の内包表記を書きたいです。

for i in user_list: for j in i: for k in j: for l in k: print(l)

と4重のfor文を回すことで、print(l)ではそれぞれの値を取得することができます。
このようにそれぞれの値を取り出して最終的にはtupleにしてリストを作りたいです。

user_list = sorted(set([tuple([tuple(j) for j in i]) for i in user_list]), key=user_list.index)

として二重for文までは作りましたが、どのように4重の内包表記を書けるのかわかりません。どのように書けるでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

namnium1125

2018/02/07 07:25

どこからどこまでをタプルにしたいのでしょうか?user_listの最初の状態と、望む最後の状態を追記していただきたいです。m(_ _)m
guest

回答2

0

黒魔術に見えるでしょうけども4重のリスト内包記法を使わなくても以下のように書けます。

python

1from itertools import chain 2 3user_list = [[[[1, 2, 3], [4, 5]]]] 4 5flatten1 = [*chain(*map(chain, *map(chain, *user_list)))] 6flatten2 = [] 7for i in user_list: 8 for j in i: 9 for k in j: 10 for l in k: 11 flatten2.append(l) 12 13print(flatten1, flatten2)

投稿2018/02/07 10:30

YouheiSakurai

総合スコア6142

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

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

0

ベストアンサー

for文を内包表記に変換する場合、内側から考えてください。

このfor文は

python

1for l in k: 2 print(l)

この内包表記と等価です

python

1[print(l) for l in k]

つまり最初のコードはこちらと等価です

python

1for i in user_list: 2 for j in i: 3 for k in j: 4 [print(l) for l in k]

簡単に考えるため、[print(l) for l in k]a() としましょう。
するともう一段階内包表記にするとこうなります。

python

1for i in user_list: 2 for j in i: 3 [a() for k in j]

a() を元に戻すとこうなります。

python

1for i in user_list: 2 for j in i: 3 [[print(l) for l in k] for k in j]

同様に考えていくと、最終的にはこのようにまとまります。

python

1[[[[print(l) for l in k] for k in j] for j in i] for i in user_list]

最終的にtupleにしたいということなので、求めているコードはこのようになるかと思います。

python

1user_list = sorted(set([tuple([tuple([tuple([l for l in k]) for k in j]) for j in i]) for i in user_list]), key=user_list.index)

投稿2018/02/07 07:43

編集2018/02/07 07:44
1ntegrale9

総合スコア98

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

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

quickquip

2018/02/07 10:16

入力が user_list = [[[[1,2],[3,4]], [[5,6],[7,8]]], [[[9,10],[11,12]],[[13,14],[15,16]]]] だとして、(((1, 2), (3, 4)), ((5, 6), (7, 8))) という要素が存在する(user_list.indexがエラーにならない)ことが前提になっていますよね。そうなっていなければこのコードはエラーで動かなくて、そうなっているならこのコードに意味はない(=なにも変化が起こらない)ですよね?
quickquip

2018/02/07 10:20

なにも変化が起こらないというわけではないですね。重複要素がある時に、重複要素が連続するように移動する作用は期待できますね。失礼しました。
1ntegrale9

2018/02/07 10:21 編集

質問者の意図は分かりませんが、質問が「4重の内包表記の書き方」だったので、結果として得られるものが何か、ということは本質的には関係ないかと思い、割愛しました。
quickquip

2018/02/07 14:50

その方針は構わないと思います。最後のコードが「重複を取り除くだけで何もしないコード」もしくは「エラーになるコード」であると分かるようなら問題ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問