6

Pythonで作成しているアプリの基本的な手順は次のとおりです。

  1. ランダムな色のリストを生成する
  2. 3D(r、g、b)空間の「ソースカラー」までのそのカラーの距離によってインデックス付けされた、これらの各カラーのマッピングを作成します。(たとえば、オレンジ(255、150、0)はダークブルー(0、0、100)よりも赤(255、0、0)に近いです。)これで、形式(距離、色)のタプルのリストができました。 )。
  3. 計算した距離に基づいてタプルのリストを並べ替えます(最小から最大まで)。
  4. ソートされた色のリストを取得します

これが私の関数で、次のエラーが発生します。TypeError:'int'オブジェクトに属性がありません'_ getitem _'行にsorted_by_dist=sorted(colorMap、key = lambda tup:tup [0])

# Sorts a list of colors according to distance from the source color
def sort_colors(colors, source):
    colorMap = ()
    sortedColors = list()
    for i in range(len(colors)):
        dist = dist_3d(colors[i], source)
        colorMap = colorMap + (dist, colors[i])

    sorted_by_dist = sorted(colorMap, key=lambda tup: tup[0])

    for (d, c) in sorted_by_dist:
        sortedColors.append(c)

    return sortedColors

私のdist_3d()関数が正しく、整数値を返すと仮定すると(そうです、そしてそうします)、私は何を間違っていますか?理解できない。

4

2 に答える 2

3

colorMap最初のインデックスがである、大きな1次元タプルとして構築していますint。だからあなたlambdaは渡されてint、それからあなたはそれにインデックスを付けようとします。

タプルのリストが必要になる可能性があります。

colorMap = []
...
    dist = dist_3d(colors[i], source)
    colorMap.append((dist, colors[i]))

色を並べ替える方法として、私は実際にこのためのkdtreeモジュールを使用し、すべてのRGBタプルをロードしました。次に、特定の色のタプルに最も近いN色を要求できます。

from kdtree import KDTree

colors = [(10,10,10),(250,50,5),(100,50,20)]
query_color = (175, 25, 50)

tree = KDTree.construct_from_data(data)
# query the 2 closest colors
nearest = tree.query(query_point=query_color, t=2)
于 2013-01-05T04:09:16.400 に答える
2

エラーは、tupがであるためですint。演算子__getitem__の名前です。[]

ただし、関数が実行しているのは、参照色からの距離に基づいて色のリストを並べ替えることだけのようです。そして、あなたはすでにdist_3d実装しています。それが機能することを考えると、色の並べ替えははるかに簡単です。それらを所定の位置に並べ替えます。

colors.sort(key=lambda color: dist_3d(color, reference_color))

または新しいリストとして:

sorted_colors = sorted(unsorted_colors, key=lambda color: dist_3d(color, reference_color))

私が言うことができるように、あなたの関数にタプル構築やループなどのすべてのものは必要ありません。

于 2013-01-05T04:17:20.747 に答える