pythonでリストの中に同じ文字列があったら、リストを組み合わせるようなプログラムを書きたいです
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,030
以下のようなコードを書いています
def main():
uldata = []
ldata = []
training0 = []
ful = open("userloc.txt")
for row in ful:
uldata.append(row)
ful.close()
fl = open("locdata.txt")
for ro in fl:
ldata.append(ro)
fl.close()
#print (uldata[1])
for i in uldata:
for a in ldata:
if a[0] in i:
training0.insert(2,a[1])
training0.insert(3,a[2])
training0.append("\n")
userloc_str = map(str,training0)
with open("training0.txt","w") as fw:
fw.writelines(userloc_str)
if __name__ == "__main__":
main()
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文を入れると
print (uldata[0])のとき
['-6rEfobYjMxpUWLNxszaxQ', 'cE27W9VPgO88Qxe4ol6y_g', "Don't waste your time."]
print (uldata[0][0])のとき
[
このようになっています
リストの中のリストが思ったように格納されていないみたいなのですが
どうすればよいでしょうか
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
残念ながら、「リストっぽい文字列」をリストに追加したところで、リストとしては認識してくれるわけではありません。
文字列はあくまでも文字列なのです。
解決する手段としては
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(',')]
こんな感じでリストに変換できるかと思います。
で、データファイル読み込み時に
ful = open("userloc.txt")
for row in ful:
uldata.append(line_parser(row))
ful.close()
こんな感じで、文字列をリストに変換後にappend()
するとよいかと思います。
ただし、上記のコードは全てのデータを文字列としてリスト化しますので、数値に変換したい場合は修正が必要です。
【補足】
後半部で、作成されたデータがおかしい件ですが、多分やりたいことはこんな感じなのではないでしょうか
for i in uldata:
for a in ldata:
if a[0] in i:
i.insert(2,a[1])
i.insert(3,a[2])
training0.append(i)
userloc_str = map(lambda d:str(d) + "\n", training0)
with open("training0.txt","w") as fw:
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ファイルにしておくと、
標準ライブラリを使って
import csv
ldata=[]
with open("locdata.csv") as f:
for d in csv.reader(f):
ldata.append(d)
のように簡単に読み込むことができます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/06/29 21:06
ということですか?
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”が何個か格納されてしまいます
どうすればよいですか??
2017/06/29 21:35
拡張子は特に何でも構いませんが、各行の行頭・行末にある [] をなくして、単に各データをカンマで区切った形式でデータを記述する方法が一般的となります
2017/06/29 23:12
ありがとうございます
2017/06/30 00:31
[]をなくしてしまうと、リストの中の値がとれなくなってしまう気がするのですが…
2017/06/30 01:13
質問2の件ですが、投稿したつもりで投稿されてませんでした。
大変遅くなってしまいましてすみません
2017/06/30 01:20
ありがとうございます
自分がやろうとしていたのと何がちがうのでしょうか…
2017/06/30 01:29 編集
空のリスト(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 に追加するように修正しました。
あとは、改行コードを行末に入れる処理を施してあります。
2017/06/30 02:01
training0にはuserlocの値を格納しています
それでもおかしくなるのはなぜですか?
2017/06/30 16: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])
2017/06/30 19:50
よくわかりました!