

以下の条件のもとプログラムを作りたいです。

  * 入力された値段から対応する品を検索するSearch関数  
（引数：値段 返り値：対応する品データ（List））  
※対応する品データ（List）：引数で指定された値段が含まれるリスト  
※csvファイルなので「,」や「"」があることに注意すること

  * 品データを元に，検索結果を表示するGoods関数  
（引数：品データ（List） 返り値：なし）

  * 入力された値段が存在しない場合の処理は，省略して良い。
  * importは使わない。

理想の実行結果がこちらです。

[code]

    値段を入力->740
    値段:740
    種類:果物
    品名:蜜柑
    
[/code]

ここからどうすればよいのかわからないです。

**現状のソースコード:**

[code]

    path=Goods.CSV
    def Search(price):
        with open(path,"r") as f:
            for l in f:
                print(l)
    
    def Goods():
    
    price=input("値段を入力->")
    
[/code]

**Goods.CSV**

[code]

    0,"640","リンゴ","果物","林檎"
    0,"440","ブドウ","果物","葡萄"
    0,"140","ナシ","果物","梨"
    0,"740","ミカン","果物","蜜柑"
    1,"220","キュウリ","野菜","胡瓜"
    1,"655","イチゴ","野菜","苺"
    1,"340","スイカ","野菜","西瓜"
    
[/code]


CC BY-SA 4.0
2022-07-04T06:58:58.700
89753
2022-07-06T06:00:42.640
2022-07-04T12:24:36.330
3060
53208
question
python
python 入力した数字に値する単語ファイルから取り出して表示


ライブラリのインポートが不可ならCSVから一行ずつ読み出した後でデリミタをもとにリスト化、filter関数にラムダ式渡して処理とかそんな感じですかね。


CC BY-SA 4.0
2022-07-04T11:17:18.487
89754
2022-07-04T11:17:18.487
53286
89753
answer


`importを使わない(=モジュールやライブラリを使わない)`場合は、想定されるモジュールやライブラリの機能・仕様をまるまる自分で構築するか、条件を付けて限定した機能・仕様の部分だけを作成することになります。

何かの講座やTutorialの課題ならば、その直前までに説明されていた内容を元に作成することになると思われるので、そういう情報や履歴を見直してみた方が良いでしょう。  
そういう段階を踏んでいない、色々な資料や記事の中から目についたものをやってみている、というのは効率が悪いでしょう。  
@Takahiro Funahashi
さんのコメントや以前の回答に紹介されていたような一通りこなせば基本的な内容は理解できるような講座やTutorialをやってみるのが良いでしょう。  
基本的な内容が済んだら、色々なアルゴリズムとか処理例の記載された書籍や講座などをやってみてください。

質問内容では1回だけ実行されるので、こだわらなくても良いのですが、Search関数の中でファイルを読むのは冗長な処理に思えるので、最初に読み込んで2次元リスト化しておいた方が良いでしょう。  
以下のようになります。

[code]

    path='Goods.CSV'
    with open(path, 'r', newline='', encoding='utf-8') as f:
        data = []
        for l in f:                     #### 行毎に取り出して処理
            csv = l.strip().split(',')  #### 改行コードを削除し、カンマで分割して1次元リスト化
            singleline = []
            for d in csv:               #### 要素毎に取り出して処理
                singleline.append(d.strip('"'))  #### 各値の前後に " が付いていたら削除して値を1次元リストに追加
            data.append(singleline)     #### 1行分を処理した後に data に追加して2次元リスト化
    
    def Search(price):
        result = None          #### 初期値は None
        for d in data:         #### 2次元リストの分だけループ
            if d[1] == price:  #### 値段の欄が同じかどうか判定
                result = d     #### 値段が同じなら該当の1次元リストを結果に格納
                break          #### ループ終了
        return result          #### 結果を戻り値として終了
    
    def Goods(info):              #### 渡された1次元リストを元に対応する項目を表示
        print(f'値段:{info[1]}')
        print(f'種類:{info[3]}')
        print(f'品名:{info[4]}')
    
    price=input("値段を入力->")
    result = Search(price)
    if result is not None:
        Goods(result)
    else:
        print('その値段の品は存在しません')
    
[/code]

* * *

バリエーションとして、値段のリストと全体のリストの2つを用意して、値段のリストの何番目のデータかのindexを取得して、全体のリストから該当のデータを取得するといった方法も考えられます。

[code]

        pricelist = [r[1] for r in data]  #### withの最後に値段だけ取り出してlistを作成する
                                          #### 値段のlist上のindexと、data上のindexを同じにする
    
    def Search(price):
        #### 値段のlist上のindexを取得し、dataの該当するindexからlistを取得して返す　無ければNoneを返す
        return data[pricelist.index(price)] if price in pricelist else None
    
[/code]

あるいはコメントにあったように辞書化しても類似の処理で出来ます。

[code]

        datadict = dict([(z[1],z) for z in data])  #### withの最後に値段をkeyにした辞書を作成する
    
    def Search(price):
        #### 辞書から該当する値段のlistを取得して返す　無ければNoneを返す
        return datadict[price] if price in datadict else None
    
[/code]

* * *

CSVファイルの読み取りと2次元リスト化もforループでは無く短縮した処理にすることが出来ます。

[code]

    with open(path, 'r', newline='', encoding='utf-8') as f:
        lines = f.read().splitlines()        #### 改行コードを削除した行毎の文字列のリスト化
        csv = [l.split(',') for l in lines]  #### カンマで分割して2次元リスト化
        data = [list(map(lambda y: y.strip('"'), x)) for x in csv]  #### 各値の前後に " が付いていたら削除
    
[/code]

短くしようと思えば以下のように辞書化まで1行にまとめることも出来ます。

[code]

    with open(path, 'r', newline='', encoding='utf-8') as f:
        datadict = dict([(y[1],y) for y in [list(map(lambda x: x.strip('"'), l.split(','))) for l in f.read().splitlines()]])
    
[/code]


CC BY-SA 4.0
2022-07-06T06:00:42.640
89785
2022-07-06T06:00:42.640
26370
89753
answer