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

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

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

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

Q&A

解決済

1回答

3219閲覧

pythonでリストの中に同じ文字列があったら、リストを組み合わせるようなプログラムを書きたいです

kohekoh

総合スコア140

Python

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

0グッド

0クリップ

投稿2017/06/29 09:40

以下のようなコードを書いています

python

1def main(): 2 uldata = [] 3 ldata = [] 4 training0 = [] 5 ful = open("userloc.txt") 6 for row in ful: 7 uldata.append(row) 8 ful.close() 9 10 fl = open("locdata.txt") 11 for ro in fl: 12 ldata.append(ro) 13 fl.close() 14 15 #print (uldata[1]) 16 17 for i in uldata: 18 for a in ldata: 19 if a[0] in i: 20 training0.insert(2,a[1]) 21 training0.insert(3,a[2]) 22 training0.append("\n") 23 24 userloc_str = map(str,training0) 25 26 with open("training0.txt","w") as fw: 27 fw.writelines(userloc_str) 28 29 30if __name__ == "__main__": 31 main() 32

userloc.txt

['-6rEfobYjMxpUWLNxszaxQ', 'cE27W9VPgO88Qxe4ol6y_g', "Don't waste your time."] ['5OumCBQ_MyQsltSdbMyunA', 'mVHrayjG3uZ_RLHkLj-AMg', 'Not easy to find. Be sure to put in directions for Rankin Police Department or you will end up at a residential home on the wrong Hawkins Ave. Found it after the third try. Also, it closes at 7pm.'] ['EZ0r9dKKtEGVx2CdnowPCw', 'mVHrayjG3uZ_RLHkLj-AMg', 'Your GPS will not allow you to find this place. Put Rankin police department in instead. They are directly across the street.'] ['xb6zEQCw9I-Gl0g06e1KsQ', 'KayYbHCt-RkbGcPdGOThNg', 'Great drink specials!'] ['QawZN4PSW7ng_9SP7pjsVQ', 'KayYbHCt-RkbGcPdGOThNg', 'Friendly staff, good food, great beer selection, and relaxing atmosphere'] ['8K8qHAH9AREKxIIZAwQ9Fg', 'KayYbHCt-RkbGcPdGOThNg', 'Fantastic! Great food, excellent beer selection! Bartenders are great!'] ['U3VIAqv7eaCCorYsVCRCHA', 'KayYbHCt-RkbGcPdGOThNg', 'I love this place! Great prices, great food, great service!!!!!!'] ['MLQre1nvUtW-RqMTc4iC9A', '1_lU0-eSWJCRvNGk78Zh9Q', 'Beautiful restoration.']

locdata.txt

['KayYbHCt-RkbGcPdGOThNg', 40.4154859, -80.0675491] ['cE27W9VPgO88Qxe4ol6y_g', 40.3541155, -80.0146597] ['mVHrayjG3uZ_RLHkLj-AMg', 40.4088301, -79.8662107] ['1_lU0-eSWJCRvNGk78Zh9Q', 40.4068423, -80.0858661] 実行結果 'K'1'm'c'K'1'm'c'K'1'm'c'K'1'm'c'K'1'm'c'K'1'm'c'K'1'm'c'K'1'm'c

したいことは
uldataにldataの0番目の文字列が含まれれば、training0の2.3番目にldataの1.2番目を格納したいです

このようになります
おかしいと思ったので、for i in uldata:の前にprint文を入れると

python

1print (uldata[0])のとき 2['-6rEfobYjMxpUWLNxszaxQ', 'cE27W9VPgO88Qxe4ol6y_g', "Don't waste your time."] 3 4print (uldata[0][0])のとき 5[ 6

このようになっています

リストの中のリストが思ったように格納されていないみたいなのですが
どうすればよいでしょうか

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

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

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

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

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

guest

回答1

0

ベストアンサー

残念ながら、「リストっぽい文字列」をリストに追加したところで、リストとしては認識してくれるわけではありません。
文字列はあくまでも文字列なのです。

解決する手段としては

1. データ(userloc.txt/locdata.txt)のフォーマットを変更する

素直にCSV/TSVまたはJSONにてデータを記述することをお勧めします。

CSVやJSONであればPython標準ライブラリにParserがありますので、実装が楽です。

2. データを解析するコードを書く
とりあえず今回の文字列の場合は

def line_parser(line): return [d.strip('\'\" ') for d in line.strip(" []\r\n").split(',')]

こんな感じでリストに変換できるかと思います。
で、データファイル読み込み時に

Python

1 ful = open("userloc.txt") 2 for row in ful: 3 uldata.append(line_parser(row)) 4 ful.close()

こんな感じで、文字列をリストに変換後にappend() するとよいかと思います。

ただし、上記のコードは全てのデータを文字列としてリスト化しますので、数値に変換したい場合は修正が必要です。


【補足】
後半部で、作成されたデータがおかしい件ですが、多分やりたいことはこんな感じなのではないでしょうか

Python

1 for i in uldata: 2 for a in ldata: 3 if a[0] in i: 4 i.insert(2,a[1]) 5 i.insert(3,a[2]) 6 training0.append(i) 7 8 userloc_str = map(lambda d:str(d) + "\n", training0) 9 10 with open("training0.txt","w") as fw: 11 fw.writelines(userloc_str)

【更に補足】

例えば

locdat.csv

'KayYbHCt-RkbGcPdGOThNg',40.4154859,-80.0675491 'cE27W9VPgO88Qxe4ol6y_g',40.3541155,-80.0146597 'mVHrayjG3uZ_RLHkLj-AMg',40.4088301,-79.8662107 '1_lU0-eSWJCRvNGk78Zh9Q',40.4068423,-80.0858661

のようにデータをCSVファイルにしておくと、
標準ライブラリを使って

Python

1import csv 2ldata=[] 3with open("locdata.csv") as f: 4 for d in csv.reader(f): 5 ldata.append(d)

のように簡単に読み込むことができます。

投稿2017/06/29 11:25

編集2017/06/29 16:23
magichan

総合スコア15898

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

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

kohekoh

2017/06/29 12:06

1に関しては、userloc.txtを作成する際に、userloc.csvにすればよい ということですか? 2で言われた通りにやって、少しif文を変えて if a[0][0] in i[0]: #print(a[1]) #print(i[0]) training0[0].insert(2,a[1]) training0[0].insert(3,a[2]) training0.append("\n") このようにしました training0にはuldataと同じものを格納しています そうすると、同じ数字が何個も格納されて 最後に”\n”が何個か格納されてしまいます どうすればよいですか??
magichan

2017/06/29 12:35

一つ目の質問ですが 拡張子は特に何でも構いませんが、各行の行頭・行末にある [] をなくして、単に各データをカンマで区切った形式でデータを記述する方法が一般的となります
kohekoh

2017/06/29 14:12

わかりました ありがとうございます
kohekoh

2017/06/29 15:31

1つ目に関してなのですが []をなくしてしまうと、リストの中の値がとれなくなってしまう気がするのですが…
magichan

2017/06/29 16:13

すみません 質問2の件ですが、投稿したつもりで投稿されてませんでした。 大変遅くなってしまいましてすみません
kohekoh

2017/06/29 16:20

なりました ありがとうございます 自分がやろうとしていたのと何がちがうのでしょうか…
magichan

2017/06/29 16:30 編集

簡単に説明すると 空のリスト(training0)に対して a[1]を3番目(index 2)に挿入 a[2]を4番目(index 3)に挿入 \n を最後に追加 を繰り返しておりましたので、おかしな結果となっておりました。 ですので、 i (userloc)データに対して a[1]を3番目(index 2)に挿入 a[2]を4番目(index 3)に挿入 を行って、その結果を training0 に追加するように修正しました。 あとは、改行コードを行末に入れる処理を施してあります。
kohekoh

2017/06/29 17:01

最初のやつには書いてなかったんですが training0にはuserlocの値を格納しています それでもおかしくなるのはなぜですか?
magichan

2017/06/30 07:48

すみません。完全に質問を見逃してました。 その場合は、外側のリスト(training0) ではなくて、その内部にあるリストに対してデータを挿入してあげなくてはなりません。 for num,i in enumerate(uldata): __for a in ldata: ____if a[0] in i: ______training0[num].insert(2,a[1]) ______training0[num].insert(3,a[2])
kohekoh

2017/06/30 10:50

ありがとうございます! よくわかりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問