簡體   English   中英

在Python中修改列表元素而無需列表理解

[英]Modify list element without list comprehension in Python

我使用此功能從圖像中提取rgb值:

def get_rgb_and_rgba_values_for_next_three_pixels(image_data, pixel_type):
    if pixel_type == "rgb":
        rgba_values = []
        rgb_values = [image_data.next()[:3], image_data.next()[:3], image_data.next()[:3]]
    else:
        rgba_values = [image_data.next()[:4], image_data.next()[:4], image_data.next()[:4]]
        rgb_values = [rgba_values[0][:3], rgba_values[1][:3], rgba_values[2][:3]]
    return [rgba_values, rgb_values]

輸出:

[[(255, 255, 255), (255, 255, 255), (255, 255, 255)], [(255, 255, 255, 0), (255, 255, 255, 0), (255, 255, 255, 0)]]

然后我使用此函數將所有lsbs更改為0:

def set_least_significant_bit_to_zero(rgb_values):
    return [value & ~1 for value in rgb_values[0][:3] + rgb_values[1][:3] + rgb_values[2][:3]]

輸出:

[254, 254, 254, 254, 254, 254, 254, 254, 254]

我的問題是:如何在不使用第二個函數的列表推導的情況下實現完全相同的目標?

沒有理由避免列表理解-它是可讀的,Python式的和高效的-但是,如果您堅持可以通過遍歷值,將新值附加到結果列表然后從中返回結果來構造結果列表,功能:

def set_least_significant_bit_to_zero(rgb_values):
    result = []
    for value in rgb_values[0][:3] + rgb_values[1][:3] + rgb_values[2][:3]:
        result.append(value & ~1)
    return result

您還可以使用itertools.chain()使for循環可迭代:

import itertools

def set_least_significant_bit_to_zero(rgb_values):
    result = []
    for value in itertools.chain(rgb_values[0][:3], rgb_values[1][:3], rgb_values[2][:3]):
        result.append(value & ~1)
    return result

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM