我有一个图像(列表列表),我想返回整个图像的平均颜色。 我尝试使用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()
只做了一片吗?
答案 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
中两个元组的第一个值。