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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

Q&A

解決済

2回答

202閲覧

for文での条件指定について

trafalbad

総合スコア303

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

0グッド

0クリップ

投稿2017/10/11 04:57

編集2017/10/11 07:46
listA=[A,B,C,D,E] listB=[[A,a],[A,b],[C,c],[C,d],[C,e]]

上のようにlistA,listBがあります。
次のようにfor文で返したいのですが、

dicted = OrderedDict() for tit in listA: for s,t in listB: if s==tit: dicted.setdefault(tit, []).append(t) else

辞書に格納する際の条件指定としてelse以降に

listBの[0]がlistAと合致しない場合'Nan'を挿入する

を指定して結果的に下記のような辞書を作成したいのですが

dic={A:a, B:'Nan', C:c, D:'Nan', E:'Nan'}

else以降の条件指定はどのようにすれば良いでしょうか?

setdefault(tit, []).append(t)→参考

追記

listC=[[A,a],[A,b],[C,c],[C,d],[C,e]]
listD=[[A,a],[A,b],[C,c],[C,d],[C,e]]
....listN

上記のようにlist(同じ長さ、要素の中身は違う)がNこあるとします

回答してもらった内容をfor文で全てのlistに適用し、pandasのDataframeで
listA
listB
...
listN
の形の行列を作りたいですが、下記のコードではうまくいきませんでした。

listed=[] dicted = OrderedDict(zip(listA, ['NaN'] * len(listA))) for i in range(5): for s, t in list_frame.iloc[i:,:]: if dicted[s] == 'NaN': dicted[s] = t listed.append(dicted)

for文で全てのlistに適用する方法を教えていただけないでしょうか?

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

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

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

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

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

guest

回答2

0

listBの[0]がlistAと合致しない場合'Nan'を挿入する

正確には
listA[i] != listB[i][0]ならばdicted[listA[i]]'Nan'を挿入
そうでなければdicted[listA[i]]listB[i][0]を挿入
ってことですね?

lang

1for tit in listA: 2 for s,t in listB:

こうしてしまうとlistAの各要素に対してlistBのすべての要素がチェックされます。
zip()で同じインデックスどうしの要素をピックアップできます。

lang

1from collections import OrderedDict 2 3listA = ['A','B','C','D','E'] 4lists = [[["A","a"],["A","b"],["C","c"],["C","d"],["C","e"]], 5 [["D","p"],["B","q"],["C","r"],["D","s"],["C","t"]]] 6 7dicted = OrderedDict() 8for l in lists: 9 for a, (b1, b2) in zip(listA, l): 10 if a == b1: 11 dicted.setdefault(a, []).append(b2) 12 else: 13 dicted.setdefault(a, []).append('Nan') 14 15print(dicted) 16# OrderedDict([('A', ['a', 'Nan']), ('B', ['Nan', 'q']), ('C', ['c', 'r']), ('D', ['Nan', 's']), ('E', ['Nan', 'Nan'])])

投稿2017/10/11 09:32

karamarimo

総合スコア2551

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

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

0

ベストアンサー

元のコードとだいぶ違いますが、こういうことでしょうか?

Python

1from collections import OrderedDict 2 3listA=['A', 'B', 'C', 'D', 'E'] 4listB=[['A', 'a'], ['A', 'b'], ['C', 'c'], ['C', 'd'], ['C', 'e']] 5 6dicted = OrderedDict(zip(listA, ['NaN'] * len(listA))) 7 8for s, t in listB: 9 if dicted[s] == 'NaN': 10 dicted[s] = t 11 12print(dicted) 13 14"""実行結果 15OrderedDict([('A', 'a'), ('B', 'NaN'), ('C', 'c'), ('D', 'NaN'), ('E', 'NaN')]) 16"""

こういうのもありですね。

Python

1from collections import OrderedDict 2 3listA=['A', 'B', 'C', 'D', 'E'] 4listB=[['A', 'a'], ['A', 'b'], ['C', 'c'], ['C', 'd'], ['C', 'e']] 5 6dicted = OrderedDict(zip(listA, ['NaN'] * len(listA))) 7 8for s, t in reversed(listB): 9 dicted[s] = t 10 11print(dicted) 12 13"""実行結果 14OrderedDict([('A', 'a'), ('B', 'NaN'), ('C', 'c'), ('D', 'NaN'), ('E', 'NaN')]) 15"""

追記を受けて

私はPandasはほとんど触ったことないです。
が、上手く行かないのは、dictedを使いまわしているからでは?

Python

1listed=[] 2dicted = OrderedDict(zip(listA, ['NaN'] * len(listA))) 3for i in range(5): 4 for s, t in list_frame.iloc[i:,:]: 5 if dicted[s] == 'NaN': 6 dicted[s] = t 7 listed.append(dicted)

ちょっとした実験。

Python

1>>> dst_list = [] 2>>> my_list = [1, 2, 3] 3>>> for i, _ in enumerate(my_list): 4... my_list[i] = 0 5... dst_list.append(my_list) 6... 7>>> dst_list 8[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 9>>> 10>>> 11>>> dst_list = [] 12>>> for i in range(3): 13... my_list = [1, 2, 3] 14... my_list[i] = 0 15... dst_list.append(my_list) 16... 17>>> dst_list 18[[0, 2, 3], [1, 0, 3], [1, 2, 0]]

投稿2017/10/11 05:49

編集2017/10/11 08:16
LouiS0616

総合スコア35660

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

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

trafalbad

2017/10/11 07:46

追記させていただきました。回答よろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問