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

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

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

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

Q&A

解決済

3回答

811閲覧

Python リストからある別のリストの値を用いて値を効率よく抽出する方法

lemonesour

総合スコア25

Python

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

0グッド

0クリップ

投稿2021/12/17 07:56

■やりたいこと
-出席リスト
group_no:0 kobetsu_no:2,5
group_no:1 kobetsu_no:1,3,4
group_no:2 kobetsu_no:1
group_no:3 kobetsu_no:4

-リスト化
group_no_list= [0, 0, 1, 1, 1, 2, 3]
kobetsu_no_list = [2, 5, 1, 3, 4, 1, 4] 
※group_no_listとkobetsu_no_listは同じ要素数

group_table = [0, 1, 2, 3] #group_noが扱う値の定義
kobetsu_table = [1, 2, 3, 4, 5] #kobetsu_noが扱う値の定義

all_data = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] #group0:1,2,3,4,5(kobetsuの値全て) からgroup3:1,2,3,4,5までを格納したリスト

copy_data = [] #group_no_listとkobetsu_no_list 用いてall_dataからグループから出席したkobetsu_noを抽出したい
※補足:上記group_no_list,kobetu_no_listからall_data = [1,** 2**, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] の太字を抽出したい

■試した事

python

1group_no_list= [0, 0, 1, 1, 1, 2, 3] 2kobetsu_no_list = [2, 5, 1, 3, 4, 1, 4] 3group_table = [0, 1, 2, 3] 4kobetsu_table = [1, 2, 3, 4, 5] 5all_data = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] 6copy_data = [] 7 8i = 0 9j = 0 10for k in range(len(group_table)): 11 for l in range(len(kobetsu_table)): 12 if i < len(kobetsu_no_list): 13 gropu_read = group_no_list[i] 14 group = group_table[k] 15 kobetsu_read = kobetsu_no_list[i] 16 kobetsu = kobetsu_table[l] 17 if gropu_read == group and kobetsu_read == kobetsu: 18 copy_data.append(all_data[j]) 19 i = i + 1 20 else: 21 pass 22 j = j + 1 23 else: 24 break 25print(copy_data)

■結果
[2, 5, 1, 3, 4, 1, 4]
正しい結果となった

■教えていただきたいこと
もう少しスマートなコードで結果を得ることが出来ないかをご教授いただきたく、よろしくお願いいたします。

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

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

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

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

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

ppaul

2021/12/17 08:12

copy_data = kobetsu_no_list と一行書けば済むのでは???
lemonesour

2021/12/17 08:21

ppaul様 お世話になっております。 早々にコメントありがとうございます。 いや、それではダメなんですよ。 実はall_dataにgroup x kobetsu の種類のデータが入っており、いま仮で[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] をいれておりまして。。 なので、guroup_no Xかつkobetsu_no Y のデータをall_dataから抽出したいんです。 分かりづらくて申し訳ありません。。
ppaul

2021/12/17 08:36

質問をもう少し現実に近いデータに書き直してください。 たとえば、 ['A1', 'A2', 'A3', 'A4', 'A5', 'B1', 'B2', 'B3', 'B4', 'B5', 'C1', 'C2', 'C3', 'C4', 'C5', 'D1', 'D2', 'D3', 'D4', 'D5'] とかですか?
guest

回答3

0

numpyを使うとループを回さない方法でもできますので、覚えておいてください。

python

1>>> import numpy as np 2>>> group_no_list= [0, 0, 1, 1, 1, 2, 3] 3>>> kobetsu_no_list = [2, 5, 1, 3, 4, 1, 4] 4>>> all_data = ['A1', 'A2', 'A3', 'A4', 'A5', 'B1', 'B2', 'B3', 'B4', 'B5', 'C1', 'C2', 'C3', 'C4', 'C5', 'D1', 'D2', 'D3', 'D4', 'D5'] 5>>> 6>>> print(np.array(all_data).reshape(4,5)[group_no_list, [x-1 for x in kobetsu_no_list]]) 7['A2' 'A5' 'B1' 'B3' 'B4' 'C1' 'D4']

投稿2021/12/17 08:50

ppaul

総合スコア24670

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

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

lemonesour

2021/12/17 09:03

ppaul様 >質問をもう少し現実に近いデータに書き直してください。 失礼しました。 >['A1', 'A2', 'A3', 'A4', 'A5', 'B1', 'B2', 'B3', 'B4', 'B5', 'C1', 'C2', 'C3', 'C4', 'C5', 'D1', 'D2', 'D3', 'D4', 'D5'] >とかですか? はい、その通りです。 ご提案ありがとうございます! ただすみません、環境がPython2.4.3でしてNumpyは使用できません。説明が不足しておりすみません。。 Numpyを使用しない方法でご教授いただけると幸いです。
guest

0

ベストアンサー

こういうことです?

Python

1dst = [] 2for group_no, kobetsu_no in zip(group_no_list, kobetsu_no_list): 3 idx = len(kobetsu_table) * group_no + (kobetsu_no - 1) 4 dst.append(all_data[idx]) 5 6print(dst)

投稿2021/12/17 08:34

LouiS0616

総合スコア35668

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

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

lemonesour

2021/12/17 09:20

LouiS0616様 ご教授ありがとうございます!期待の動作になります! ただ、提示しているサンプルデータだと正しく動くのですが、リスト内のデータ量を増やす(group_tableを0-17、kobetsu_tableを0-31 all_data内の要素数も18x32個)とdst.append(all[idx])にて「list index out of range」となってしまいます。 何かお分かりになるでしょうか?all_dataの要素数以上にidxはならないと思うのですが。。 お手数おかけいたします。
LouiS0616

2021/12/17 09:29

kobetsu_tableが0始まりなら idx = len(kobetsu_table) * group_no + kobetsu_no で良いんじゃないですかね。 1引いてるのは1始まりだからなので。
lemonesour

2021/12/17 10:01

LouiS0616様 アドバイスありがとうございます。 私のリストデータに問題がございました。 ご提案いただいたロジックを利用させていただきます!
guest

0

guroup_no Xかつkobetsu_no Y のデータをall_dataから抽出したいんです。

元データから???_tableで指定された値のみ取得したいということでしょうか?
であればall_dataというのは不要だと思います。

Python

1group_no_list= [0, 0, 1, 1, 1, 2, 3] 2kobetsu_no_list = [2, 5, 1, 3, 4, 1, 4] 3 4group_table = [0, 1, 2, 3] 5kobetsu_table = [1, 2, 3, 4, 5] 6 7ret = [] 8for g, k in zip(group_no_list, kobetsu_no_list): 9 # 定義域に含まれるものだけ 10 if g in group_table and k in kobetsu_table: 11 ret.append(k) 12 13print(ret) # [2, 5, 1, 3, 4, 1, 4]

投稿2021/12/17 08:35

can110

総合スコア38341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問