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

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

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

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

Q&A

解決済

2回答

302閲覧

PythonのFor文ネストについて

skyworldmusic

総合スコア4

Python 3.x

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

0グッド

0クリップ

投稿2022/05/23 02:00

前提

PythonのFor文のネストの動きがリスト形式と辞書形式では違うのかを教えていただき
かつ同じ動きにするためにはどのように対応したら良いかを教えて頂きたいです。

独学かつ初心者のため、お見苦しいソースコードではありますが、ご容赦ください。

実現したいこと

下記2つのCSVにて「No」をキーにして一致した部分を出力させたい。
For文のネストの動きをリスト形式と同じ形に動かしたい。

goods.csv

1No,商品名 21,いちご 32,もも 43,すいか

price.csv

1No,価格 21,350 32,100 43,800

発生している問題・エラーメッセージ

下記パスの箇所にてfor frice_csvdataが2回目以降の繰り返しが行われない。 for goods_csvdata in goods_csvline: for price_csvdata in price_csvline:

該当のソースコード

python

1 2#import 読み込み 3import csv 4 5#入力データパス 6indir = "" #ローカルパスを指定 7 8#goods.csvを読み込み 9goods_csvfile = open(indir + "goods.csv", "r", encoding ="ms932", errors = "", newline = "") 10#goods.csv辞書形式で取得 11goods_csvline = csv.DictReader(goods_csvfile, delimiter=",", doublequote = True, lineterminator = "\r\n", quotechar = '"', skipinitialspace = True) 12 13#price.csvを読み込み 14price_csvfile = open(indir + "price.csv", "r", encoding ="ms932", errors = "", newline = "") 15#goods.csv辞書形式で取得 16price_csvline = csv.DictReader(price_csvfile, delimiter=",", doublequote = True, lineterminator = "\r\n", quotechar = '"', skipinitialspace = True) 17 18#Noが一致したときに商品名と価格をあわせて表示 19for goods_csvdata in goods_csvline: 20 for price_csvdata in price_csvline: 21 if goods_csvdata["No"] == price_csvdata["No"]: 22 print (str(goods_csvdata["商品名"])+str(price_csvdata["価格"])) 23 else: 24 continue

試したこと

python

1#リスト形式 2a = [1,2] 3b = [3,4] 4 5for c in a : 6 for d in b: 7 print(str(c) + "," + str(d)) 8 9#print結果 101,3 111,4 122,3 132,4

print結果は想定したFor文のネストの動きとなっていた。

補足情報(FW/ツールのバージョンなど)

Python バージョン:3.10.4
ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

DictReaderは一種のiteratorで、内部で「どの行まで処理したか」という状態を持っています。
つまり一度forループで末尾まで到達すると、次のループでも先頭からではなく末尾から、すなわち何も処理されません。

今回の場合では内側のループがこのケースに該当するので
price_csvline = list(price_csvline)
と事前にlist化することで意図通りに動作するようになります。

投稿2022/05/23 02:33

can110

総合スコア38266

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

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

skyworldmusic

2022/05/23 04:05

can110様 ご回答ありがとうございます。 内部で「どの行まで処理をおこなった」が保持されているのですね。 困っておりましたので助かりました。
guest

0

python

1#import 読み込み 2import csv 3 4#入力データパス 5indir = "" #ローカルパスを指定 6 7#goods.csvを読み込み 8with open(indir + "goods.csv", "r", encoding="cp932", errors = "", newline = "") as f: 9 goods_csvline = csv.DictReader(f, delimiter=",", doublequote = True, lineterminator = "\r\n", quotechar = '"', skipinitialspace = True) 10 goods_csvline = [*goods_csvline] 11 12#price.csvを読み込み 13with open(indir + "price.csv", "r", encoding="cp932", errors = "", newline = "") as f: 14 price_csvline = csv.DictReader(f, delimiter=",", doublequote = True, lineterminator = "\r\n", quotechar = '"', skipinitialspace = True) 15 price_csvline = [*price_csvline] 16 17#Noが一致したときに商品名と価格をあわせて表示 18for goods_csvdata in goods_csvline: 19 for price_csvdata in price_csvline: 20 if goods_csvdata["No"] == price_csvdata["No"]: 21 print(str(goods_csvdata["商品名"])+str(price_csvdata["価格"])) 22 else: 23 continue 24 25# 26いちご350 27もも100 28すいか800

投稿2022/05/23 02:29

melian

総合スコア19803

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

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

skyworldmusic

2022/05/23 04:06

melian様 ご回答ありがとうございます。 ソースコードの編集イメージまで作成いただきありがとうございます。 助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問