Как записывать изменения списка, с некоторыми особенностями?

Есть список a = [40, 40, 40, 40, 40, 40] и список b =[]

Список a = [40, 40, 40, 40, 40, 40] меняется слева направо, по каждому щелчку мыши.

В список b =[] требуется записать значения отличные от 40.

Пример:

a = [40, 40, 40, 40, 40, 40]    b =[]
a = [33, 40, 40, 40, 40, 40]    b =[33]
a = [33, 77, 40, 40, 40, 40]    b =[33, 77]
a = [40, 40, 229, 40, 40, 40]   b =[33, 77 ,229]
a = [40, 40, 40, 40, 40, 40]    b =[33, 77 ,229]

То есть, значения не должны пропадать.

Мой код и пояснения. (Необязательно к просмотру)

def getGrid():
    state_left = win32api.GetKeyState(0x01)  
    state_right = win32api.GetKeyState(0x02)  
    while True:
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:  
            state_left = a
            if a == 1 or a == 0 :
                time.sleep(0.3)
                image = ImageGrab.grab()
         
            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid.append(b)
                print(currentGrid)
                currentGrid.clear()  

По каждому щелчку мыши, код берет пиксель с определенной координаты. Он записывает значение голубого цвета, и добавляет в список currentGrid, который в примере называется a. После этого он очищает список, и так по кругу. Значения могут меняться не только слева направо, но в моем случае это будет именно так, по этому можно сказать что они всегда меняются слева направо. Нужен еще один список который будет "запоминать" изменившиеся значение и записывать их.


Ответы (1 шт):

Автор решения: Александр

Вот решение (функция fucn, остальное - тестирование)

import random

def func(a, b):
    a = set(a)
    a.discard(40)
    b += list(a.difference(b))
    return b

a = [40 for i in range(6)]

b = []

for i in a:
    print(f"{a=}, {b=}")
    a.insert(0, random.randint(0, 80))
    a.pop(-1)
    b = func(a, b)

print(f"{a=}, {b=}")

a = [40 for i in range(6)]
b = func(a, b)

print(f"{a=}, {b=}")

пример вывода:

a=[40, 40, 40, 40, 40, 40], b=[]
a=[5, 40, 40, 40, 40, 40], b=[5]
a=[20, 5, 40, 40, 40, 40], b=[5, 20]
a=[49, 20, 5, 40, 40, 40], b=[5, 20, 49]
a=[43, 49, 20, 5, 40, 40], b=[5, 20, 49, 43]
a=[53, 43, 49, 20, 5, 40], b=[5, 20, 49, 43, 53]
a=[70, 53, 43, 49, 20, 5], b=[5, 20, 49, 43, 53, 70]
a=[40, 40, 40, 40, 40, 40], b=[5, 20, 49, 43, 53, 70]

вы вставляете эту функцию, и используете, где нужно

повторю функцию, на всякий случай:

def func(a, b):
    a = set(a)
    a.discard(40)
    b += list(a.difference(b))
    return b

использование:

b = func(a, b)

Поправка 1:

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

def func(a, b):
    a = set(a)
    a.discard(40)
    b += list(a.difference(b))
    return b


b = []
a = [40, 40, 40, 40, 40, 40]
b = func(a, b)
print(b)  # []

a = [33, 40, 40, 40, 40, 40]
b = func(a, b)
print(b)  # [33]

a = [33, 77, 40, 40, 40, 40]
b = func(a, b)
print(b)  # [33, 77]

a = [40, 40, 229, 40, 40, 40]
b = func(a, b)
print(b)  # [33, 77, 229]

a = [40, 40, 40, 40, 40, 40]
b = func(a, b)
print(b)  # [33, 77, 229]

Поправка 2:

можно сжать функцию ещё больше:

def func(a, b):
    a = set(a) - {40}
    return b + list(a.difference(b))

Поправка 3:

def func(a, b):
    a = set(a) - {40}
    return b + list(a.difference(b))


def getGrid():
    saveGrid = []
    state_left = win32api.GetKeyState(0x01)  
    state_right = win32api.GetKeyState(0x02)  
    while True:
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:  
            state_left = a
            if a == 1 or a == 0 :
                time.sleep(0.3)
                image = ImageGrab.grab()
         
            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid.append(b)
                saveGrid = func(currentGrid, saveGrid)
                print(currentGrid, saveGrid)
                currentGrid.clear()  

Поправка 4: с повторениями:

def func(a, b):
    a = list(filter((40).__ne__, a))
    return b + a

Поправка 5: (5, карл!!) с правильными повторениями:

def getGrid():
    saveGrid = []
    state_left = win32api.GetKeyState(0x01)  
    state_right = win32api.GetKeyState(0x02)  
    while True:
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:  
            state_left = a
            if a == 1 or a == 0 :
                time.sleep(0.3)
                image = ImageGrab.grab()
         
            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid.append(b)
                saveGrid += [b]
                print(currentGrid, saveGrid)
                currentGrid.clear() 

Поправка 5.5:

def getGrid():
    state_left = win32api.GetKeyState(0x01)  
    state_right = win32api.GetKeyState(0x02)  
    while 1:
        saveGrid = []
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:  
            state_left = a
            if a == 1 or a == 0 :
                time.sleep(0.3)
                image = ImageGrab.grab()
         
            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid.append(b)
                saveGrid += [b]
                print(currentGrid, saveGrid)
                currentGrid.clear() 

Правка 6: -_- если кнопка не нажата, не будет проблем

def getGrid():
    state_left = win32api.GetKeyState(0x01)  
    state_right = win32api.GetKeyState(0x02)  
    while 1:
        saveGrid = []
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:  
            state_left = a
            if a == 1 or a == 0 :
                time.sleep(0.3)
                image = ImageGrab.grab()
            else:
                continue
         
            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid.append(b)
                saveGrid += [b]
                print(currentGrid, saveGrid)
                currentGrid.clear() 

Поправка 6.5:

def getGrid():
    state_left = win32api.GetKeyState(0x01)  
    state_right = win32api.GetKeyState(0x02)  
    while 1:
        saveGrid = []
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:  
            state_left = a
            if a == 1 or a == 0:
                time.sleep(0.3)
                image = ImageGrab.grab()
         
                for cord in Cords.cordArray:
                    r, g, b = image.getpixel(cord)
                    currentGrid.append(b)
                    saveGrid += [b]
                    print(currentGrid, saveGrid)
                    currentGrid.clear() 

Поправка 7:

def getGrid():
    currentGrid = []
    state_left = win32api.GetKeyState(0x01)  
    state_right = win32api.GetKeyState(0x02)  
    while 1:
        saveGrid = []
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:  
            state_left = a
            if a == 1 or a == 0:
                time.sleep(0.3)
                image = ImageGrab.grab()
         
                for cord in Cords.cordArray:
                    r, g, b = image.getpixel(cord)
                    currentGrid.append(b)
                    saveGrid += [b]
                    print(currentGrid, saveGrid)
                    currentGrid.clear() 

Поправка 7.5:

def getGrid():
    currentGrid = []
    saveGrid = []
    state_left = win32api.GetKeyState(0x01)  
    state_right = win32api.GetKeyState(0x02)  
    while 1:
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:  
            state_left = a
            if a == 1 or a == 0:
                time.sleep(0.3)
                image = ImageGrab.grab()
         
                for cord in Cords.cordArray:
                    r, g, b = image.getpixel(cord)
                    currentGrid.append(b)
                    saveGrid += [b]
                    print(currentGrid, saveGrid)
                    currentGrid.clear() 

Поправка 8:

def getGrid():
    currentGrid = []
    state_left = win32api.GetKeyState(0x01)  
    state_right = win32api.GetKeyState(0x02)  
    while 1:
        saveGrid = []
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:  
            state_left = a
            if a == 1 or a == 0:
                time.sleep(0.3)
                image = ImageGrab.grab()
         
                for cord in Cords.cordArray:
                    r, g, b = image.getpixel(cord)
                    currentGrid.append(b)
                    if b != 40:
                        saveGrid += [b]
                    print(currentGrid, saveGrid)
                    currentGrid.clear() 

Поправка ∞.5:

def getGrid():
    currentGrid = []
    state_left_init = win32api.GetKeyState(0x01)
    while 1:
        saveGrid = []
        state_left = win32api.GetKeyState(0x01)
        if state_left != state_left_init and state_left in {0, 1}:
            time.sleep(0.3)
            image = ImageGrab.grab()
            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid += [b]
                if b != 40:
                    saveGrid += [b]
                print(currentGrid, saveGrid)
                #currentGrid.clear() 
→ Ссылка