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

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

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

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

Q&A

解決済

4回答

357閲覧

文字列を比較して配列に格納できない

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2017/07/11 00:43

ans配列の要素の文字列の最初の文字がlinesの要素の最初の文字と一致するならlinesの2番目の要素('A'/'B'/'C'/'D')をline_alpha配列に格納する、というシステムを作りたいです。

lines = [['cat', 'A'], ['dog', 'B'], ['rabbit', 'C'], ['daisy', 'D']] ans = [['c'], ['d']] for i in range(4): line_alpha =[] for j in range(5): eqe_ans = str(ans[j]) if lines[j][0].startswith(eqe_ans) == True: line_alpha.append(lines[j][1]) print(line_alpha)

とコードを書いて実行すると[]がprintで出力されました。
デバックしてみると

if lines[j][0].startswith(eqe_ans) == True:

がTrueになる条件がこのコードではないようで。
本来なら、

[['A'],['B','D']]

と出力させたいです。('dog'・'daisy'のように先頭の文字が同じもののlinesの1番目の要素は二次元配列の要素としてひとまとめにしたい)
デバック時に

line_alpha = '[\\'d'\\']'

が取れているようで'[\'と余計なものが入っていて条件式が満たされないのかと思うのですが解決策がわからず...。どう直せばよいでしょうか?

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

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

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

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

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

guest

回答4

0

もう解決済みですが

lines = [['cat', 'A'], ['dog', 'B'], ['rabbit', 'C'], ['daisy', 'D']] ans = [['c'], ['d']] line_alpha = [[line[1] for line in lines if a[0]==line[0][0]] for a in ans] print(line_alpha )

pythonのfor文は他の言語でのforeachに相当するので、わざわざfor i in range(len(list))みたいな書き方をする必要はないです

投稿2017/07/12 13:34

rege

総合スコア38

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

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

0

ベストアンサー

とりあえず、質問の

'[\'と余計なものが入っていて

の部分から。

これは、今回のコードにおいて、ans[0]には ['c']リストの中に文字列型の'c'が格納されているのですが、eqe_ans = str(ans[j])としていきなり全体を文字列に変えていることに起因しております。

本来ここで必用なことは、ans[0]の内部にある文字列を取り出してstartswith() の引数に渡す

Python

1 eqe_ans = ans[j][0] 2 if lines[j][0].startswith(eqe_ans) == True:

または、リストをタプル型に変更してstartswith()に渡す

Python

1 eqe_ans = tuple(ans[j]) 2 if lines[j][0].startswith(eqe_ans) == True:

なのではないでしょうか。


次に、for文での index絡みの問題点が何箇所かあります。

Python

1for i in range(4): 2 line_alpha =[] 3 for j in range(5): #ans の範囲は(0~1)なのでは? 4 eqe_ans = str(ans[j]) 5 #↓ linesのインデックスは jではなくてiなのでは? 6 if lines[j][0].startswith(eqe_ans) == True: 7 #↓ linesのインデックスは jではなくてiなのでは? 8 line_alpha.append(lines[j][1])

基本的にfor文は(indexを使う必要性が無い場合)リストの要素でループを回すようにしてください。
このようすることで、 indexの取り違いや範囲の間違いは少なくなります。

Python

1for word, symbol in lines: 2 for prefix in ans: 3

で、更に

  • 内側のループと外側のループを入れ替える
  • 全体の結果を格納するためのリスト(res)と各ワード毎の結果を格納するためのリスト(line_alpha)を分け、ループ毎に line_alpharesappend()するようにする

の部分で大きく構成を変えて・・
たぶんやりたい事はこんな感じになるのではないでしょうか。

Python

1lines = [['cat', 'A'], ['dog', 'B'], ['rabbit', 'C'], ['daisy', 'D']] 2ans = [['c'], ['d']] 3 4res = [] 5for prefix, in ans: 6 line_alpha =[] 7 for word,symbol in lines: 8 if word.startswith(prefix): 9 line_alpha.append(symbol) 10 res.append(line_alpha) 11print(res) 12# => [['A'],['B','D]]

更に内側のループを内包表記にするとこんな感じです。

Python

1lines = [['cat', 'A'], ['dog', 'B'], ['rabbit', 'C'], ['daisy', 'D']] 2ans = [['c'], ['d']] 3 4res = [] 5for prefix, in ans: 6 line_alpha =[symbol for word,symbol in lines if word.startswith(prefix)] 7 res.append(line_alpha)

投稿2017/07/11 04:34

magichan

総合スコア15898

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

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

0

startswithを使ってうまくいけるかなぁと思って、少し長くなりますが、違う方法で次のようにやってみました
よろしかったら参考願います

Python

1lines = [['cat', 'A'], ['dog', 'B'], ['rabbit', 'C'], ['daisy', 'D']] 2ans = [['c'], ['d']] 3line_alpha =[] 4 5ans_f = [ans[i][0] for i in range(len(ans))] 6lines_f = [lines[i][0][0] for i in range(len(lines))] 7for i in ans_f: 8 arr = [lines[index][1] for index, item in enumerate(lines_f) if i == item] 9 if arr != []: 10 line_alpha.append(arr) 11 12print(line_alpha)

投稿2017/07/11 01:53

xxBadMoon2017

総合スコア114

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

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

0

問題点が2つあります。

1)

for i in range(4): line_alpha =[]

i(linesで調べる要素のインデックス)が変わるたびに、結果を入れる配列 line_alpha を空にしているので、それ以前に見つけた「一致する要素」が消えてしまっています。

2)

for j in range(5): eqe_ans = str(ans[j])

質問のコードで、ansは要素数2のリストですが、ansのインデックスが range(5) になっています。
リストの要素を全部調べる際には、直接数値を書くのではなく、len関数で要素数を調べるべきです。

これらを反映した以下のコードを試してみてください。

lines = [['cat', 'A'], ['dog', 'B'], ['rabbit', 'C'], ['daisy', 'D']] ans = [['c'], ['d']] line_alpha =[] for i in range(len(lines)): for j in range(len(ans)): eqe_ans = str(ans[j]) if lines[j][0].startswith(eqe_ans) == True: line_alpha.append(lines[j][1]) print(line_alpha)

投稿2017/07/11 01:05

coco_bauer

総合スコア6915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問