Получение списка в качестве параметра в Python

#python #list #parameters

#python #Список #параметры

Вопрос:

Я написал функцию, которая принимает в качестве параметра 3 целых числа, поскольку мне задано три пикселя, и мне нужно вернуть пиксель с наименьшим расстоянием от средних значений красного, зеленого и синего по всем пикселям.

 def get_best_pixel(pixel1, pixel2, pixel3):
   
    red_average = (pixel1.red   pixel2.red   pixel3.red) // 3
    green_average = (pixel1.green   pixel2.green   pixel3.green) // 3
    blue_average = (pixel1.blue   pixel2.blue   pixel3.blue) // 3
    pixel1_dist = get_pixel_dist(pixel1, red_average, green_average, blue_average)
    pixel2_dist = get_pixel_dist(pixel2, red_average, green_average, blue_average)
    pixel3_dist = get_pixel_dist(pixel3, red_average, green_average, blue_average)
    if pixel1_dist <= pixel2_dist and pixel1_dist <= pixel3_dist:
        return pixel1
    elif pixel3_dist <= pixel1_dist and pixel3_dist <= pixel2_dist:
        return pixel3
    elif pixel2_dist <= pixel1_dist and pixel2_dist <= pixel3_dist:
        return pixel2
  

но я хочу преобразовать функцию, чтобы она вместо этого принимала эти целые числа из списка:

 def get_best_pixel(pixel_list):

    pixel_list = []
  

Кстати, я использую SimpleImage.

Комментарии:

1. Что вы подразумеваете под «таким образом, каждый пиксель в списке может быть принят с 3 значениями RGB» — каждый пиксель будет иметь только одно значение R, G и B, не так ли?

2. @Grismar да, я имел в виду 3 значения, по одному для красного, зеленого и синего

3. Списки работают как параметр так же, как и другие переменные, просто используйте их внутри функции. Что вы делаете со своим двойником / ?

4. Я не понял, в чем заключается ваш вопрос.

Ответ №1:

Определите функцию расстояния между двумя пикселями:

 def dist(p1, p2):
    return (
        (p1.red - p2.red)**2
          (p1.green - p2.green)**2
          (p1.blue - p2.blue)**2
    )**0.5
  

«Лучший» пиксель минимизирует расстояние до среднего пикселя:

 from dataclasses import dataclass
from statistics import mean

@dataclass
class RgbPixel:
    red: int
    green: int
    blue: int

def best(pixels):
    avg = RgbPixel(
        int(mean(p.red for p in pixels)),
        int(mean(p.green for p in pixels)),
        int(mean(p.blue for p in pixels)),
    )
    return min(pixels, key=lambda p: dist(p, avg))
  

Комментарии:

1. Это концептуально лучший ответ, хотя он игнорирует использование SimpleImage , которое может уже иметь структуры данных, подобные RgbPixel определенному здесь, которые затем было бы предпочтительнее использовать.

2. @Grimar Я быстро взглянул на исходный код этой библиотеки, и мне показалось Pixel , что классу требуется ссылка на базовое изображение. github.com/adilu/simpleimage/blob/master/simpleimage/Pixel.py Короче говоря, автору библиотеки, вероятно, следует провести небольшой рефакторинг. 😉

Ответ №2:

ваш список пикселей должен выглядеть примерно так. [[пиксель1.красный, пиксель1.зеленый, пиксель1.синий],[пиксель2.красный, пиксель2.зеленый, пиксель2.синий],[пиксель3.красный, пиксель3.зеленый, пиксель3.синий]]

итак, если вы передаете значения функции в этом формате, вы можете получить его, используя pixel_list[1] [0] и так далее..

Ответ №3:

  • Если вы могли бы передать список при вызове функции, то выполните следующие действия:

       class Pixel:
          pass
    
      def fun(a):
          print(a)
          print(type(a))
    
      fun([Pixel(), Pixel(), Pixel()])
      

    Вывод:

     [<__main__.Pixel instance at 0x7f1688e4e5f0>, <__main__.Pixel instance at 0x7f1688e4e680>, <__main__.Pixel instance at 0x7f1688e4e6c8>]
    <type 'list'>
      
  • Если вы все еще хотите вызывать функцию с одним параметром один за другим, то:

       def fun2(*b):
          bb = list(b)
          print(bb)
          print(type(bb))
    
      fun2(Pixel(), Pixel(), Pixel())
      

    Вывод:

     [<__main__.Pixel instance at 0x7f1688e4e5f0>, <__main__.Pixel instance at 0x7f1688e4e680>, <__main__.Pixel instance at 0x7f1688e4e6c8>]
    <type 'list'>
      

Ответ №4:

Вы можете использовать statictics.mean из всех red значений, сделайте то же самое для green и blue

 from statistics import mean

def get_best_pixel_list(pixel_list):
    red_average = mean([p.red for p in pixel_list])
    green_average = mean([p.green for p in pixel_list])
    blue_average = mean([p.blue for p in pixel_list])
  

Вручную

 red_average = sum((p.red for p in pixel_list)) / len(pixel_list)
  

Комментарии:

1. Похоже, этот модуль был выпущен в стандартную библиотеку Python в версии 3.4

2. @MateenUlhaq я добавил