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

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

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

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

Q&A

解決済

2回答

198閲覧

二次元配列のある値ををif文で繰り返し出力する際の記述

mpec

総合スコア14

Python 3.x

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

0グッド

0クリップ

投稿2019/04/02 02:17

BeatifulSoupで取得した値で指定する値のみ出力したいのですが簡素に記述できません
どのようにしたら簡素出来るのかご教授お願いできませんでしょうか

python

1data = [['A', 'B'], ['D'], ['E'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'],\ 2 ['A', 'B'], ['D'], ['E'], ['F'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'],\ 3 ['A', 'B'], ['D'], ['E'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'], ['G'],\ 4 ['A', 'B'], ['D'], ['E'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'],\ 5 ['A', 'B'], ['D'], ['E'], ['F'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'],\ 6 ['A', 'B'], ['D'], ['E'], ['F'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'],\ 7 ['A', 'B'], ['D'], ['E'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'],\ 8 ['A', 'B'], ['D'], ['E'], ['F', 'G', 'H', 'I', 'J'], ['F'], ['F', 'G', 'H', 'I', 'J'],\ 9 ['A', 'B'], ['D'], ['E'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'], ['G'],\ 10 ['A', 'B'], ['D'], ['E'], ['F', 'G', 'H', 'I', 'J'], ['F', 'G', 'H', 'I', 'J'], ['G', 'H', 'I', 'J']]

取得した値は、A~Jの値を二次元配列で10回程度ループしてこのように並んでいます
この中から H だけを出力したいのですが
H が無い箇所などもあるため、if文で分岐させているのですが記述が長くなってしまいます

現在の記述

python

1for i in range(len(data)): 2 count = 0 3 for num in data[i]: 4 if 3 <= i <= 5: 5 if len(data[i]) == 1 and 'F' in num or \ 6 len(data[i]) == 1 and 'G' in num: 7 count = 0 8 print('H無し') 9 elif count < 2: 10 count += 1 11 elif count == 2: 12 print(num) 13 count += 1 14 else: 15 pass 16 17 elif 9 <= i <= 11: 18 if len(data[i]) == 1 and 'F' in num or \ 19 len(data[i]) == 1 and 'G' in num: 20 count = 0 21 print('H無し') 22 elif count < 2: 23 count += 1 24 elif count == 2: 25 print(num) 26 count += 1 27 else: 28 pass 29 30 elif 15 <= i <= 17: 31 if len(data[i]) == 1 and 'F' in num or \ 32 len(data[i]) == 1 and 'G' in num: 33 count = 0 34 print('H無し') 35 elif count < 2: 36 count += 1 37 elif count == 2: 38 print(num) 39 count += 1 40 else: 41 pass 42     # 以後7回繰り返し 43

途中の分岐の値が変わるだけなので簡素にできそうなのですが、自分の力ではできません...
この記述を簡素にすることはできますでしょうか?
宜しくお願いいたします。

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

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

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

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

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

LouiS0616

2019/04/02 02:25

期待している実行結果を書いて下さい。
mpec

2019/04/02 12:19

ご指摘ありがとうございます。 実行結果は他の方が回答していた記述が良い思いましたので今回は割愛させていただきます 以後気を付けます
guest

回答2

0

H だけを出力したい

出力形式がいまいちはっきりしないのですが、Hが含まれるリストを出力する方法です。具体的な出力形式を示していただければ、そのように回答を修正します。

Python3

1pprint(list(filter(lambda e: 3 <= e[0] % 6 <= 5 and 'H' in e[1], enumerate(data))))

結果

[(3, ['F', 'G', 'H', 'I', 'J']), (4, ['F', 'G', 'H', 'I', 'J']), (5, ['F', 'G', 'H', 'I', 'J']), (10, ['F', 'G', 'H', 'I', 'J']), (11, ['F', 'G', 'H', 'I', 'J']), (15, ['F', 'G', 'H', 'I', 'J']), (16, ['F', 'G', 'H', 'I', 'J']), (21, ['F', 'G', 'H', 'I', 'J']), (22, ['F', 'G', 'H', 'I', 'J']), (23, ['F', 'G', 'H', 'I', 'J']), (28, ['F', 'G', 'H', 'I', 'J']), (29, ['F', 'G', 'H', 'I', 'J']), (34, ['F', 'G', 'H', 'I', 'J']), (35, ['F', 'G', 'H', 'I', 'J']), (39, ['F', 'G', 'H', 'I', 'J']), (40, ['F', 'G', 'H', 'I', 'J']), (41, ['F', 'G', 'H', 'I', 'J']), (45, ['F', 'G', 'H', 'I', 'J']), (47, ['F', 'G', 'H', 'I', 'J']), (51, ['F', 'G', 'H', 'I', 'J']), (52, ['F', 'G', 'H', 'I', 'J']), (57, ['F', 'G', 'H', 'I', 'J']), (58, ['F', 'G', 'H', 'I', 'J']), (59, ['G', 'H', 'I', 'J'])]

投稿2019/04/02 05:41

編集2019/04/02 05:49
Kenji.Noguchi

総合スコア358

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

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

mpec

2019/04/02 12:28

出力形式はHのみ出力でしたがこちらの記述も今後参考になります ありがとうございます
guest

0

ベストアンサー

分岐の値に周期性がありそうなので(35,911,15~17と6ずつ変化)、余りを使った条件表記をすると良いのではないでしょうか。

if 3 <= i%6 <= 5: if len(data[i]) == 1 and 'F' in num or \ len(data[i]) == 1 and 'G' in num: count = 0    (以下略)

もしくは、orをつかって条件をひたすら羅列してしまう方法もあるかと思います。

if 3 <= i <= 5 or 9 <= i <= 11 or 15 <= i <= 17: (以下略)

ご参考になれば幸いです。

投稿2019/04/02 02:37

amahara_waya

総合スコア1029

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

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

mpec

2019/04/02 12:23

20回でも30回でも周期性があれば可能なようなので最も合致しました 余りを使う条件表記、は頭にありませんでした ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問