opencv 在Python中处理列表中的重复项[已关闭]

g2ieeal7  于 2023-10-24  发布在  Python
关注(0)|答案(2)|浏览(201)

已关闭,此问题需要details or clarity,目前不接受回答。
**想要改进此问题吗?**通过editing this post添加详细信息并澄清问题。

上个月关门了。
Improve this question
我正在尝试使用Python制作一个像素颜色表。这个表有超过10,000个值,我想快速渲染图像(通常需要大约4秒渲染)。无论如何,我想处理列表中的重复项以快速加载帧,这里有一个例子:(255,255,255),(255,255,255),(255,255,255)将变为(255,255,255),2
我试过自己写代码,但它真的坏了。我已经使用python很长一段时间了,我仍然没有得到任何地方让这个脚本工作。
提前感谢!

dly7yett

dly7yett1#

根据元素是否排序,您有两个选项。

  • 如果元素被排序,那么可以使用itertools.groupby作为上面提到的一个注解者。
from itertools import groupby

pixel_colors = [(255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0), (1,1,1)]

compressed_colors = [(color, len(list(group)) - 1) for color, group in groupby(pixel_colors)]

print(compressed_colors)
  • 如果元素没有排序,那么我认为这样一个简单的方法是可行的
from collections import defaultdict

pixel_colors = [(255, 255, 255), (255, 255, 255), (255, 255, 255), (0, 0, 0), (0, 0, 0)]

color_counts = defaultdict(int)

for color in pixel_colors:
    color_counts[color] += 1

compressed_colors = [(color, count - 1) for color, count in color_counts.items()]

print(compressed_colors)

请注意,对输入进行排序并使用第一种方法可能会产生更多开销。

oxcyiej7

oxcyiej72#

您也可以使用Counter函数来实现所需的结果。下面是一个如何使用它来压缩像素颜色列表的示例:

from collections import Counter

def compress_pixel_colors(pixel_colors):
    color_counts = Counter(pixel_colors)
    compressed_pixels = [(color, count) if count > 1 else color for color, count in color_counts.items()]
    return compressed_pixels

# Example usage:
pixel_colors = [(255, 255, 255), (255, 255, 255), (255, 255, 255)]
compressed_pixels = compress_pixel_colors(pixel_colors)
print(compressed_pixels)

这段代码利用collections模块中的Counter类来高效地统计像素颜色的出现次数,然后使用列表解析直接创建压缩列表。

使用Itertools.groupby

它有效地将连续的相同元素分组。

from itertools import groupby

def compress_pixel_colors(pixel_colors):
    compressed_pixels = []

    for color, group in groupby(pixel_colors):
        count = len(list(group))
        if count > 1:
            compressed_pixels.append((color, count))
        else:
            compressed_pixels.append(color)

    return compressed_pixels

# Example usage:
pixel_colors = [(255, 255, 255), (255, 255, 255), (255, 255, 255)]
compressed_pixels = compress_pixel_colors(pixel_colors)
print(compressed_pixels)

最佳方法...

  • 这两种方法都能为您提供给予良好的性能,并且对于大多数用例来说,速度上的差异不太可能很大。因此,最终的选择取决于您的编码风格和偏好。

如果可读性和简单性是你主要关心的问题,Counter通常是一个更直接的选择。
如果您更喜欢功能性内存效率更高的方法,itertools.groupby可能更合适。*

相关问题