6

以下是我用 Python 编写的应用程序的基本步骤:

  1. 生成随机颜色列表
  2. 创建每种颜色的映射,由该颜色到 3D (r, g, b) 空间中的“源颜色”的距离进行索引。(例如,橙色 (255, 150, 0) 比深蓝色 (0, 0, 100) 更接近红色 (255, 0, 0)。现在,我有一个格式为 (distance, color )。
  3. 根据我计算的距离(从最低到最高)对该元组列表进行排序。
  4. 检索已排序颜色的列表

这是我的函数,我收到以下错误:TypeError: 'int' object has no attribute '_ getitem _' on line 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一个大的单维元组,第一个索引是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 回答