くだすれPython(超初心者用) その36

■ このスレッドは過去ログ倉庫に格納されています
2018/01/01(月) 20:18:42.82ID:iOcRvNll
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますが、お礼は Python の布教と初心者の救済をお願いします。

エラーを解決したいときはエラー表示や環境(バージョン/IDE or command line)を略さずに書き込んで下さい。
騙りが頻発しています。質問する方は一時的なトリップをつけることを検討して下さい。
次スレは >>985 辺りで

前スレ
くだすれPython(超初心者用) その35
http://mevius.5ch.net/test/read.cgi/tech/1496411341/
VIPQ2_EXTDAT: checked:default:1000:512:----: EXT was configured
50デフォルトの名無しさん
垢版 |
2018/01/13(土) 22:24:55.51ID:BAsP1Vyl
下記のような配列を作ってその中から条件を満たしているものの中で
価格が最大値のものを検索するということがしたいのです。

品目     条件     価格
りんご     OK     100  
みかん     OK     200
れもん     NG     300

1.この場合、配列は下記のようなリストを作ればよいのでしょうか?

list=[[りんご, OK, 100], [みかん, OK, 200], [れもん, NG, 300]]

2.上記1.のアプローチが正しいとして、上記リストにおいて、条件がOKのもので価格が一番高いものの
配列の番号(または品目)を取得する方法をどなたかお教えいただけないでしょうか。
(辞書でもリストでも何でも良いのでが上記の表のような配列の裁き方が検索しても見つけられず・・・)
2018/01/14(日) 00:20:35.69ID:t0jHIC/R
max関数を調べてみるとよい
2018/01/14(日) 01:00:13.30ID:rilCPocj
>>50
Pythonじゃなきゃダメ?
正直、データベースソフトでやるべき案件だと思う
どうしてもPythonでやるなら、内包表記を使ってリストから
条件に合う要素を抜き出して新しいリストを作り、データを絞り込んで行く

>>> a = [['りんご', 'OK', 100], ['みかん', 'OK', 200], ['れもん', 'NG', 300]]
>>> ok_list = [elem for elem in a if elem[1] == 'OK']
>>> ok_list
[['りんご', 'OK', 100], ['みかん', 'OK', 200]]
>>> max_price = max([elem[2] for elem in ok_list])
>>> max_price
200
>>> name = [elem[0] for elem in ok_list if elem[2] == max_price]
>>> name
['みかん']

あと、list=[[りんご, OK, 100], [みかん, OK, 200], [れもん, NG, 300]] と最初にあったが
変数名にlistなどのPythonに元からあるオブジェクト名そのまんまを使うのは避けよう
エラーの元になる
2018/01/14(日) 01:32:55.95ID:YcirJyIj
>>52
Pythonスレで Pythonじゃなきゃダメ? ってオイオイだろ
これなんか学校の課題って気がする

list=[["りんご", "OK", 100], ["みかん", "OK", 200], ["れもん", "NG", 300]]
l_OK = [item_OK for item_OK in filter(lambda list_item : list_item[1] == "OK", list)]
#l_OK = [item for item in list if item[1] == "OK"]
print( max(l_OK, key=(lambda item_OK: item_OK[2]) )[0] )
54デフォルトの名無しさん
垢版 |
2018/01/14(日) 02:18:12.29ID:yVTJx4nd
pandas使え
5550です
垢版 |
2018/01/14(日) 08:27:28.43ID:krdFkWsl
50です。みなさんご回答ありがとうございます。

>>51
検索すると色々あるのですが分かりそうで分からず…。

>>52, >>53
ありがとうございます!いずれの方法でもできました。
一度条件で抽出してからmax使うのですね(そこに思い至りませんでした…)

>>54
後々触ってみたいとは思うのですが、この程度のデータなのでまずは基本的なことを知りたいと思いまして。
2018/01/14(日) 10:39:38.00ID:TwgO/caM
pandasのstr.containsとかって、真偽反転するとき“~”を付けるじゃないですか
この波線って、pythonの側のビット演算子ですか?
strアクセサ用のオプション記号?

x=1
tf=2 in x
print(~tf)
とかで試してみるとT/Fではなく数字が出てくるので、strアクセサ用の機能?
2018/01/14(日) 13:23:26.45ID:0mtDcMfe
>56
in を使うなら、x=[1]とするべきでは?
また、否定演算子は~でなくてnotを使うべき。
~は、ビット毎の反転をとる演算子。Trueは1、Falseは0とみなして計算されるはず。
58デフォルトの名無しさん
垢版 |
2018/01/14(日) 14:50:25.95ID:79VwseEt
だれもそんな話はしてないぞ
2018/01/14(日) 15:32:15.53ID:DgdnagvN
>>50
もう解決してるみたいだけど
価格が0または正だと仮定していいなら
print(max(list, key=(lambda x: x[2] if x[1] == 'OK' else -1)))
とすれば要素の抽出とかはなくてもいける
ただし'OK'のものが一件もないと価格が'NG'のものを返すので注意が必要
6050
垢版 |
2018/01/14(日) 15:34:13.85ID:DgdnagvN
> 価格が'NG'のものを返す
価格じゃなくて条件だったわ
2018/01/14(日) 15:57:09.64ID:/4CphuTL
>>56
配列の番号(と品目)を取得するようにしたニダね

list=[["りんご", "OK", 100], ["みかん", "OK", 200], ["れもん", "NG", 300]]
dic_OK = {list_idx:list_item for list_idx,list_item in enumerate(list) if list_item[1] == 'OK'}
list_index = max( dic_OK, key=(lambda dkey: dic_OK[dkey][2]) )
print( 'List index:', list_index )
print( 'Item name:', list[list_index][0] )
2018/01/14(日) 16:27:06.07ID:/4CphuTL
>>59
ついでに、max()使うとOKフラグ付きの同じ最高価格の物が複数あると困ったニダになるからな
6350
垢版 |
2018/01/14(日) 16:31:48.67ID:DgdnagvN
よくよく考えたらmax()のキーにタプルを返すようにすれば
> 価格が0または正だと仮定していいなら
の制限は要らなかったな
print(max(list, key=(lambda x: ( x[1] == 'OK', x[2]))))
> ただし'OK'のものが一件もないと条件が'NG'のものを返すので注意が必要
の方はそのままだけど
2018/01/14(日) 16:33:19.71ID:DgdnagvN
>>62
そこは要件次第でしょ
65デフォルトの名無しさん
垢版 |
2018/01/14(日) 17:34:08.11ID:CiqP7kj2
なぜ、後になるにつれてこうも劣化していくのか

>>52
>変数名にlistなどのPythonに元からあるオブジェクト名そのまんまを使うのは避けよう
その気持ちよくわかります
■ このスレッドは過去ログ倉庫に格納されています