Pythonに詳しくて優しい人来て

1: 2019/05/29(水) 20:35:03.301 ID:8OfDBRitMNIKU
リストの更新があった部分だけ更新したいんだけどどうやればできるの?

lst = ['a','b','c']

a = 1
b = 2
c = 3


このリストと変数定義があって
a = 2だけ変更があった場合に

lst = ['2','b','c']

こう返したい

2: 2019/05/29(水) 20:36:08.725 ID:8OfDBRitMNIKU
ちなみに
lst = ['2','2','3']と返すことはできた

ただbとcは変数のままにしておきたい

3: 2019/05/29(水) 20:37:42.227 ID:mQnZJRe20NIKU
その程度もわからんのか(´・ω・)

5: 2019/05/29(水) 20:38:21.587 ID:8OfDBRitMNIKU
>>3
こーどかいてくれない?

4: 2019/05/29(水) 20:38:15.646 ID:Rrf9hrgq0NIKU
ちょっと何いってるか分からんね
とりあえずその[2,2,3]と返せたコード貼ってくれ

6: 2019/05/29(水) 20:43:23.730 ID:8OfDBRitMNIKU
>>4
ちょっと待ってて
擬似例だったから実際に223を返すやつ作ってない

いまから作ってくる

7: 2019/05/29(水) 20:44:21.399 ID:lBFVqEUidNIKU
意味がわからないんだけど、bとcは変数じゃなくて文字として処理したいってこと?変数なら[2, 2, 3]になるの当たり前だと思うけど

8: 2019/05/29(水) 20:45:21.959 ID:8OfDBRitMNIKU
もういいや原文ママはっちゃう

import o10_11

def koushin(p, v):
for q in v:
def _koushin1():
pn = p['namae']
qn = q['namae']

if 'infinity' == o10_11.get_ekikan_kyori(pn, qn):
return q

else:
if qn in p['temae_list']:
return q

else:
koushin_dict = {}
#qの名前
koushin_dict['namae'] = qn
#qの最短距離
koushin_dict['saitan_kyori'] = o10_11.get_ekikan_kyori(pn, qn) + float(p['saitan_kyori'])

#手前リストの更新
koushin_dict['temae_list'] = [qn] + p['temae_list']
return koushin_dict

print(_koushin1())

#駅の例
eki1 = {'namae':"池袋", 'saitan_kyori':'infinity', 'temae_list':[]}
eki2 = {'namae':"新大塚", 'saitan_kyori':1.2, 'temae_list':["新大塚", "茗荷谷"]}
eki3 = {'namae':"茗荷谷", 'saitan_kyori':0., 'temae_list':["茗荷谷"]}
eki4 = {'namae':"後楽園", 'saitan_kyori':'infinity', 'temae_list':[]}

#駅リスト
lst = [eki1, eki2, eki3, eki4]

#テスト
tes_list = [{'namae':"池袋", 'saitan_kyori':3.0, 'temae_list':["池袋", "新大塚", "茗荷谷"]}, eki2, eki3, eki4]

koushin(eki2, lst)

9: 2019/05/29(水) 20:46:17.936 ID:8OfDBRitMNIKU
ここでいうテストと同じ値を返したい

10: 2019/05/29(水) 20:47:14.496 ID:8OfDBRitMNIKU
ちなみに上を実行するとこれが返ってくる

{'namae': '池袋', 'saitan_kyori': 3.0, 'temae_list': ['池袋', '新大塚', '茗荷谷']}
{'namae': '新大塚', 'saitan_kyori': 1.2, 'temae_list': ['新大塚', '茗荷谷']}
{'namae': '茗荷谷', 'saitan_kyori': 0.0, 'temae_list': ['茗荷谷']}
{'namae': '後楽園', 'saitan_kyori': 'infinity', 'temae_list': []}

21: 2019/05/29(水) 21:09:44.165 ID:Rrf9hrgq0NIKU
ああ、>>10がprintされるのね
把握した
本質じゃないけど
#qの最短距離
koushin_dict['saitan_kyori'] = o10_11.get_ekikan_kyori(pn, qn) + float(p['saitan_kyori'])
これって何でfloat(p['saitan_kyori']) を足してるの?

11: 2019/05/29(水) 20:48:01.940 ID:RLFWvrCTdNIKU
list(0)で上書きすればええんちゃうん

13: 2019/05/29(水) 20:53:59.923 ID:8OfDBRitMNIKU
>>11
それでいいんだけどこの場合どうすりゃいいのかわからんち

12: 2019/05/29(水) 20:51:52.725 ID:Rrf9hrgq0NIKU
koushin(p,v)の引数p,vはそれぞれ何を想定していてreturnする値は何を想定しているんだ?

13: 2019/05/29(水) 20:53:59.923 ID:8OfDBRitMNIKU
>>12
ttp://pllab.is.ocha.ac.jp/~asai/book-data/ex14_7.ml
これをPythonで書いてるんだ

14: 2019/05/29(水) 20:56:00.744 ID:8OfDBRitMNIKU
>>12
pは直前に確定した駅
vはまだ未確定の駅

最終的に返したいのは繋がっている駅のみ更新したリストを返したい

15: 2019/05/29(水) 21:00:29.661 ID:Rrf9hrgq0NIKU
なるほど
真面目に読むからちょっと待って

17: 2019/05/29(水) 21:01:40.573 ID:8OfDBRitMNIKU
>>15
ごめんね
ありがとう

16: 2019/05/29(水) 21:01:20.798 ID:8OfDBRitMNIKU
そもそも元の解答例と求め方が全然違うのかもしれんけどとりあえず練習としてPythonで書いてる

改善点もあれば教えてほしい

18: 2019/05/29(水) 21:02:39.445 ID:8OfDBRitMNIKU
o10_11.get_ekikan_kyoriについては繋がってたら距離が、繋がってなかったらinfinityを返すようになってる

19: 2019/05/29(水) 21:03:58.544 ID:Rrf9hrgq0NIKU
インデント無いから読みづらいんだがこれfor文の各ループでprint(_koushin1()) をするってことだよね?
何も値返さなくない?

20: 2019/05/29(水) 21:08:50.467 ID:8OfDBRitMNIKU
>>19
_koushin1は内部内関数みたいな使い方をしているよ

22: 2019/05/29(水) 21:10:27.542 ID:8OfDBRitMNIKU
値も一応返ってくる

と思ったけど
return _koushin1()


print(koushin(eki2, lst))に変えたら返り血がこうなった…

{'namae': '池袋', 'saitan_kyori': 3.0, 'temae_list': ['池袋', '新大塚', '茗荷谷']}

23: 2019/05/29(水) 21:11:28.720 ID:O7c8Qlsc0NIKU
池袋で返り血?

26: 2019/05/29(水) 21:15:56.450 ID:8OfDBRitMNIKU
>>23
まちがえたごめん!

24: 2019/05/29(水) 21:11:31.206 ID:Rrf9hrgq0NIKU
ああ、ごめん何でもない理解した
|AB| + |BC| = |AC|的な計算してるのね

25: 2019/05/29(水) 21:13:43.181 ID:Rrf9hrgq0NIKU
やっと>>1のしたいこと理解した
更新無い奴は詳細表示したくないわけね

26: 2019/05/29(水) 21:15:56.450 ID:8OfDBRitMNIKU
>>24,25
そう!!!分かりにくかったね
やりたいことはそれだけなんだけどわからないんだ

27: 2019/05/29(水) 21:17:59.784 ID:8OfDBRitMNIKU
できそう?

30: 2019/05/29(水) 21:27:31.312 ID:Rrf9hrgq0NIKU
koushinに渡した引数lst = [eki1, eki2, eki3, eki4] からeki1,…,eki4って変数名を取り出すのは多分無理だと思う
変数名ってオブジェクトへの一方方向の参照だし
そういうことがしたければlistじゃなくて辞書使うとかしてラベル付けておくしかないんじゃないかな

31: 2019/05/29(水) 21:30:29.841 ID:8OfDBRitMNIKU
>>30
やっぱりそうなのかー
ocamlでは出来てるのは言語の違い?
それともアプローチの仕方の問題なのかな?

32: 2019/05/29(水) 21:34:36.737 ID:Rrf9hrgq0NIKU
import o10_11

def koushin(p, v):
for key, q in v.items():
def _koushin1():
pn = p['namae']
qn = q['namae']

if 'infinity' == o10_11.get_ekikan_kyori(pn, qn):
return q

else:
if qn in p['temae_list']:
return q

else:
koushin_dict = {}
#qの名前
koushin_dict['namae'] = qn
#qの最短距離
koushin_dict['saitan_kyori'] = o10_11.get_ekikan_kyori(pn, qn) + float(p['saitan_kyori'])

#手前リストの更新
koushin_dict['temae_list'] = [qn] + p['temae_list']

# 更新前と同じ場合はkeyを返す
if koushin_dict == q:
return key

return koushin_dict

print(_koushin1())

#駅の例
eki1 = {'namae':"池袋", 'saitan_kyori':'infinity', 'temae_list':[]}
eki2 = {'namae':"新大塚", 'saitan_kyori':1.2, 'temae_list':["新大塚", "茗荷谷"]}
eki3 = {'namae':"茗荷谷", 'saitan_kyori':0., 'temae_list':["茗荷谷"]}
eki4 = {'namae':"後楽園", 'saitan_kyori':'infinity', 'temae_list':[]}

#駅リスト
dict = {"eki1":eki1, "eki2":eki2, "eki3":eki3, "eki4":eki4}

#テスト
tes_list = [{'namae':"池袋", 'saitan_kyori':3.0, 'temae_list':["池袋", "新大塚", "茗荷谷"]}, eki2, eki3, eki4]

koushin(eki2, dict)



こんな感じじゃないかな

33: 2019/05/29(水) 21:36:33.031 ID:Rrf9hrgq0NIKU
ocamlは弄ったことないから何とも言えないわすまん

34: 2019/05/29(水) 21:38:02.963 ID:8OfDBRitMNIKU
>>33
なるほど
ありがとう

一旦は辞書に書き換えてみる

また後で振り返って他に方法ないか探してみるよ

ありがとね