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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

7228閲覧

python3 多次元配列での空要素の削除方法

Shimizukei

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

1グッド

1クリップ

投稿2020/04/19 04:26

pythonで多次元配列を思うように扱うことができず,調べても有効な記事を見つけられなかったため,質問させていただきます.

l=[[a,b,None,c,None],[d,e,None,None,f]]のような配列を[[a,b,c],[d,e,f]]のように空要素を削除する方法を探しております.
[x for x in l if x != "None"]で試しているのですが、エラーとなって読み込めず、これはおそらく1次元配列の場合に
適用できるものなのかな、と推測していますが多次元の例がわからず詰まってしまっています。

よろしくお願いいたします.

DrqYuto👍を押しています

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

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

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

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

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

LouiS0616

2020/04/19 04:28

> これはおそらく1次元配列の場合に適用できるものなのかな 一次元配列に対して上手く働くことは確認しましたか?
Shimizukei

2020/04/19 04:39

l = ["a","b",None,"c",None] [x for x in l if x != None] ['a', 'b', 'c']と確認できています。
LouiS0616

2020/04/19 04:42

質問に記載のコードだとif節が if x != None ではなく if x != "None" になっていますけれど、これは書き間違いだということでしょうか。 ここを直せば上手くいく、というわけでは決してありませんが、目に付くところから直す価値はあるかと思います。
meg_

2020/04/19 04:43

「エラーとなって読み込めず」とはどのようなエラーですか?
Shimizukei

2020/04/19 05:00

>LouiS0616 さま >meg_さま ありがとうございます。 if x != None ではなく if x != "None"では何も変わらなかった(エラーではない)ので""を外してみたら1次元ではうまくいきました。 改めて下記の二次元で試してみると何も変化が無い状況です。 l=[["a","b",None,"c",None],["d","e",None,None,"f"]](質問時の配列の要素には「””」が抜けていました) [x for x in l if x != None] [['a', 'b', None, 'c', None], ['d', 'e', None, None, 'f']]
guest

回答2

0

python

1[x for x in l if x != None]

このときXとして渡されるものは何か考えてみましょう。

python

1l=[[a, b, None, c, None], [d, e, None, None, f]]

なので、xとして渡されるのは[a, b, None, c, None]と[d, e, None, None, f]です。この時何のエラーが返ってくるのか知りませんが、[a, b, None, c, None] != Noneでは質問者さんがやりたいことは実現できないことは理解できると思います。

python

1[[y for y in x if y != None] for x in l]

とすればよいでしょう。

投稿2020/04/19 05:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

二次元リストは、一次元リストのリスト です。()
一次元リストで上手くいく方法があるのであればそれを各要素に適用すれば良いでしょう。

Python

1l = [['a', 'b', None, 'c', None], ['d', 'e', None, None, 'f']] 2 3dst = [] 4for block in l: 5 new_block = [x for x in block if x != None] 6 dst.append(new_block) 7 8l = dst 9print(l)

これでも充分使える筈です。


註:
そもそもn次元リストという表現自体Pythonでは本質的ではありませんが、
常用される語句ではあるので本回答ではそのまま活用したいと思います。

発展

尚、このような場合は入れ子の内包表記が有用です。

Python

1l = [ 2 [x for x in block if x != None] for block in l 3]

慣れないうちは呪文にしか見えないと思うので、for文で書いても構いません。

投稿2020/04/19 05:07

編集2020/04/19 05:10
LouiS0616

総合スコア35676

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

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

Shimizukei

2020/04/19 05:55 編集

>LouiS0616 さま ご回答ありがとうございます、うまく要素を除くことができました。 初心者で内容に理解が及ばないところもありますが dst = [] 空の配列を設定 for block in l: lの中のblock(配列)を繰り返し以下を読み取る new_block = [x for x in block if x != None] blockの要素にNoneがあれば取り除く dst.append(new_block) 空の配列にNoneを除いた配列を挿入 l = dst lにdstを代入 と捉えています。とりあえず動きはしますが、回答の式を読み解いていこうと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問