-1

私のプログラムは、最も近いペアの距離を計算することになっています。xpts は x 座標でソートされたペア/座標の配列です。ypts は、y 座標でソートされた配列です。分割統治法を使用しようとしているので、配列の半分を再帰的に渡します。ただし、エラーが発生します。

TypeError: 'float' object is not iterable:  a1, pair1= closest_pair(xlft,ylft)

私のコードは次のとおりです。

def closest_pair(xpts,ypts):
  if xpts size < = 3: 
   if xsize==1:
        return xpts[0][0]
    elif xsize==2:
        return dist(xpts[0],xpts[1])
    else:
        one= xpts[0]
        two= xpts[1]
        three= xpts[2]
        s1= dist(one,two)
        s2= dist(two,three)
        s3= dist(one,three)
        s= (min(s1,s2,s3),min(xpts[0],xpts[1],xpts[2]))
    return s
  else:
   ...
    xlft= xpts[:xsize/2]
    xrht= xpts[(xsize/2)+1:]
    ylft= []
    yrht= []
    median= xpts[(xsize/2)-1][0]


    for p in ypts:
        if p[0] <= median:
            ylft.append(p)
        else:
            yrht.append(p)

    a1, pair1= closest_pair(xlft,ylft)
    a2, pair2= closest_pair(xrht,yrht)
    st= []
    if a1 < a2:
        a3, pair3= (a1,pair1)

    else:
        a3, pair3= (a2,pair2)

        for p in ypts:
            if  abs(p[0]-median) < a3:
                st.append(p)

                n_st= len(st)
                closest= (a3,pair3)
                if n_st>1:
                    for i in range(n_st-1):
                        for j in range(i+1,min(i+8,n_st)):
                            if dist(st[i],st[j]) < closest[0]:
                                closest= (dist(st[i],st[j]),(st[i],st[j]))
        d= closest
        return d


d1 = closest_pair(xpts, ypts)[0]
print d1
4

2 に答える 2

2
if xsize==1:
        return xpts[0][0]

ここでフロートを返しています。これがエラーの原因です。

おそらく、座標タプルのリストとリストへのインデックスがあり、タプルはfloat反復できない を返します。したがって、メッセージ。

于 2013-05-08T04:19:30.797 に答える
0

closest_pairfloat を返すので、

a1, pair1= closest_pair(xlft,ylft)

例外が発生します。これはシーケンス アンパッキングと呼ばれ、次の値を繰り返し処理しようとします。closest_pair(xlft,ylft)

トレースバックには、例外の行番号が含まれます。#<== exception here例外をスローしている行に対応するマーカー (例: ) を含めることができれば、最も役に立ちます。

于 2013-05-08T04:17:36.123 に答える