使用zip()从列表列表中获取平均颜色(红色,绿色,蓝色)时遇到问题

时间:2016-12-20 13:57:29

标签: python average

我有一个图像(列表列表),我想返回整个图像的平均颜色。 我尝试使用zip()将图像分成红色,绿色,蓝色的3个部分,但是当我运行代码时:

def average(image):
    """Returns the average color of the pixels in the image"""
    red = []
    green = []
    blue = []
    for r, g, b in zip(image):
        red.append(r), green.append(g), blue.append(b)
    average_color = (sum(red) / len(red)), (sum(green) / len(green)), \
                    (sum(blue) / (len(blue)))
    return average_color 

它说:

ValueError: not enough values to unpack (expected 3, got 1).

我不确定出了什么问题,zip()只做了一片吗?

1 个答案:

答案 0 :(得分:1)

如果image是具有(r, g, b)值的元组序列,则需要将整个序列作为单独的参数应用于*args。这将生成3个新列表,并为您分隔色带:

def average(image):
    red, green, blue = zip(*image)
    return (
        sum(red) / len(red),
        sum(green) / len(green), 
        sum(blue) / (len(blue))

zip()结合了一个或多个迭代的值;你只给了它一个可迭代的,所以你只需得到相同的值:

>>> sample = [('foo', 'bar', 'baz'), ('spam', 'ham', 'eggs')]
>>> next(zip(sample))
('foo', 'bar', 'baz')

但是如果您使用*args,则将序列中包含的每个元素都应用为单独的参数,就像您使用zip()调用zip(args[0], args[0], ..., args[n])一样,有效地为您提供行的转置列:

>>> next(zip(*sample))
('foo', 'spam')

其中'foo''spam'sample中两个元组的第一个值。