лямбда-функция и регулярное выражение - PullRequest
0 голосов
/ 25 мая 2020

Я использую сценарий из https://towardsdatascience.com/a-keras-pipeline-for-image-segmentation-part-1-6515a421157d для разделения набора данных. Я не понимаю, что делает эта часть

all_frames = os.listdir(FRAME_PATH)
all_masks = os.listdir(MASK_PATH)


all_frames.sort(key=lambda var:[int(x) if x.isdigit() else x 
                                for x in re.findall(r'[^0-9]|[0-9]+', var)])
all_masks.sort(key=lambda var:[int(x) if x.isdigit() else x 
                               for x in re.findall(r'[^0-9]|[0-9]+', var)])

В частности, я не понимаю, что делает все, что делает var:. Моим первым предположением было бы понимание списка, но оно не соответствует структуре.

[ expression for item in list if conditional ] 

Также какова цель этой части re.findall(r'[^0-9]|[0-9]+', var)?

спасибо

1 Ответ

2 голосов
/ 25 мая 2020

int(x) if x.isdigit() else x - это тернарный оператор («если условие, то это еще то»), который, как вы правы, не является частью понимания списка. Здесь говорится «превратить x (из понимания списка) в целое число, если оно содержит только цифры».

Итак, мы могли бы записать все это так:

def convert_integer(x):
    if x.isdigit():
        return int(x)
    else:
        return x

def key_function(var):
    return [convert_integer(x) 
               for x in re.findall(r'[^0-9]|[0-9]+', var)]

all_frames.sort(key = key_function)
...