如何更新DjangoModel之套用最大distance欄位值

13 views
Skip to first unread message

AndyChung

unread,
Apr 7, 2012, 11:21:33 AM4/7/12
to pyth...@googlegroups.com
有個Image model裡頭屬性有id,distance,以下將寫的程式貼出, 
vectord的值會隨著neighbours迴圈,逐漸變數字 

views.py片段程式: 

neighbours=[{'vector': [2, 0, 1, 0], 'label': '2'}....其他資料依此格式類推] 

for nvector in neighbours: 
    vectord=10(屬於id=2) 
    """經過一個for迴圈 
    vectord=4(屬於id=1) 
    經過一個for迴圈 
    vectord=3(屬於id=3) 
    經過一個for迴圈 
    vectord=8(屬於id=4) 
    經過一個for迴圈 
    vectord=2(屬於id=2) 
    經過一個for迴圈 
    vectord=2(屬於id=0.5)""" 

    for tid in nvector['label']: 
        t=Image.objects.get(pk=tid) 
        t.distance=vectord 
        t.save() 

此程式result: 
id=1 distance=4 
id=2 distance=0.5 
id=3 distance=3 
id=4 distance=8 

可是目前遇到的問題在於id=2之distance會因為上述寫法,而得0.5, 
但我其實是想要id=2之distance要記錄"10",也就是vectord中id=2之間最大的值, 
但會因為我這樣寫法,而被覆蓋, 
請問該怎麼修改這個程式,才會在相對應的id之vectord值取最大的distance紀錄呢? 
麻煩大家了,謝謝您。 

目標result: 
id=1 distance=4 
id=2 distance=10 
id=3 distance=3 
id=4 distance=8

Buganini

unread,
Apr 7, 2012, 11:44:40 AM4/7/12
to pyth...@googlegroups.com
2012/4/7 AndyChung <andy...@gmail.com>:

> 有個Image model裡頭屬性有id,distance,以下將寫的程式貼出,
> vectord的值會隨著neighbours迴圈,逐漸變數字
>
> views.py片段程式:
>
> neighbours=[{'vector': [2, 0, 1, 0], 'label': '2'}....其他資料依此格式類推]
>
> for nvector in neighbours:
>     vectord=10(屬於id=2)
>     """經過一個for迴圈
>     vectord=4(屬於id=1)
>     經過一個for迴圈
>     vectord=3(屬於id=3)
>     經過一個for迴圈
>     vectord=8(屬於id=4)
>     經過一個for迴圈
>     vectord=2(屬於id=2)
>     經過一個for迴圈
>     vectord=2(屬於id=0.5)"""

這行是不是寫錯了@@a
應該是
vectord=0.5(屬於id=2)
不然我就看不懂了…

>
>     for tid in nvector['label']:
>         t=Image.objects.get(pk=tid)
>         t.distance=vectord
>         t.save()
>
> 此程式result:
> id=1 distance=4
> id=2 distance=0.5
> id=3 distance=3
> id=4 distance=8
>
> 可是目前遇到的問題在於id=2之distance會因為上述寫法,而得0.5,
> 但我其實是想要id=2之distance要記錄"10",也就是vectord中id=2之間最大的值,
> 但會因為我這樣寫法,而被覆蓋,
> 請問該怎麼修改這個程式,才會在相對應的id之vectord值取最大的distance紀錄呢?
> 麻煩大家了,謝謝您。

取最大值就用max()囉…
如果t.distance的初始值是None的話,那就用t.distance=max(t.distance, vectord)即可
如果不是的話就要另外處理初始值的問題


> 目標result:
> id=1 distance=4
> id=2 distance=10
> id=3 distance=3
> id=4 distance=8
>

> --
> 您已訂閱「Google 網上論壇」的「python.tw」群組,因此我們特別傳送這封郵件通知您。
> 如要在此群組張貼留言,請傳送電子郵件至 pyth...@googlegroups.com
> 如要取消訂閱此群組,請傳送電子郵件至 pythontw+u...@googlegroups.com
> 如需更多選項,請造訪此群組:http://groups.google.com/group/pythontw?hl=zh-TW

AndyChung

unread,
Apr 7, 2012, 12:28:55 PM4/7/12
to pyth...@googlegroups.com
感謝buganini 的回應
是的 謝謝糾正 
那個地方的確是
vectord=0.5(屬於id=2)

為了怕標有誤
把每個id都有標固定數字
如每個id預設標100

剛才也試了您提供的t.distance=max(t.distance, vectord)
似乎正中您說的 我初始值非None的情況
厄....處理初始值....暫時不知如何下手

能再有解法或提示嗎 謝謝 麻煩了

Buganini <buga...@gmail.com> 於 2012年4月7日下午11:44 寫道:
2012/4/7 AndyChung <andy...@gmail.com>:
> 有個Image model裡頭屬性有id,distance,以下將寫的程式貼出,
> vectord的值會隨著neighbours迴圈,逐漸變數字
>
> views.py片段程式:
>
> neighbours=[{'vector': [2, 0, 1, 0], 'label': '2'}....其他資料依此格式類推]
>
> for nvector in neighbours:
>     vectord=10(屬於id=2)
>     """經過一個for迴圈
>     vectord=4(屬於id=1)
>     經過一個for迴圈
>     vectord=3(屬於id=3)
>     經過一個for迴圈
>     vectord=8(屬於id=4)
>     經過一個for迴圈
>     vectord=2(屬於id=2)
>     經過一個for迴圈
>     vectord=2(屬於id=0.5)"""

這行是不是寫錯了@@a
應該是
   vectord=0.5(屬於id=2)
不然我就看不懂了...


>
>     for tid in nvector['label']:
>         t=Image.objects.get(pk=tid)
>         t.distance=vectord
>         t.save()
>
> 此程式result:
> id=1 distance=4
> id=2 distance=0.5
> id=3 distance=3
> id=4 distance=8
>
> 可是目前遇到的問題在於id=2之distance會因為上述寫法,而得0.5,
> 但我其實是想要id=2之distance要記錄"10",也就是vectord中id=2之間最大的值,
> 但會因為我這樣寫法,而被覆蓋,
> 請問該怎麼修改這個程式,才會在相對應的id之vectord值取最大的distance紀錄呢?
> 麻煩大家了,謝謝您。

取最大值就用max()囉...

Buganini

unread,
Apr 7, 2012, 12:50:49 PM4/7/12
to pyth...@googlegroups.com
2012/4/8 AndyChung <andy...@gmail.com>:

> 感謝buganini 的回應
> 是的 謝謝糾正
> 那個地方的確是
> vectord=0.5(屬於id=2)
>
> 為了怕標有誤
> 把每個id都有標固定數字
> 如每個id預設標100
>
> 剛才也試了您提供的t.distance=max(t.distance, vectord)
> 似乎正中您說的 我初始值非None的情況
> 厄....處理初始值....暫時不知如何下手
>
> 能再有解法或提示嗎 謝謝 麻煩了

可以先做好max value的map再塞進去
max_values={}

for ...:
max_values[tid]=max(max_values.get(tid),vectord)

先用dict來裝資料
dict.get的說明你可以看help(dict.get)

另外這裡也有點怪…
nvector['label']是字串,你確定你是要取字元?

AndyChung

unread,
Apr 8, 2012, 1:58:43 AM4/8/12
to pyth...@googlegroups.com
謝謝您的回信
我的問題有些錯誤
能指正且又提供做法

多虧您的提醒
真的把字串當做字元了

因為發現這個問題
寫法不需怕抓不到最大值 且可以更簡潔了
且不用用到max 及 max value的map 的寫法
(但還是很高興 又學到一種寫法)

for nvector in neighbours:
    idkey=nvector['label']
    vectord=distance
    t=Image.objects.get(pk=int(idkey))
    t.distance=vectord
    t.save()

謝謝您的熱心幫忙 願事事順利:)

另外這裡也有點怪...
Reply all
Reply to author
Forward
0 new messages