| 90 | |
| 91 | |
| 92 | class KeyFrameMatcher: |
| 93 | def __init__(self): |
| 94 | pass |
| 95 | |
| 96 | def extract_number_from_filename(self, file_name): |
| 97 | result = [] |
| 98 | number = -1 |
| 99 | for i in file_name: |
| 100 | if ord(i)>=ord("0") and ord(i)<=ord("9"): |
| 101 | if number == -1: |
| 102 | number = 0 |
| 103 | number = number*10 + ord(i) - ord("0") |
| 104 | else: |
| 105 | if number != -1: |
| 106 | result.append(number) |
| 107 | number = -1 |
| 108 | if number != -1: |
| 109 | result.append(number) |
| 110 | result = tuple(result) |
| 111 | return result |
| 112 | |
| 113 | def extract_number_from_filenames(self, file_names): |
| 114 | numbers = [self.extract_number_from_filename(file_name) for file_name in file_names] |
| 115 | min_length = min(len(i) for i in numbers) |
| 116 | for i in range(min_length-1, -1, -1): |
| 117 | if len(set(number[i] for number in numbers))==len(file_names): |
| 118 | return [number[i] for number in numbers] |
| 119 | return list(range(len(file_names))) |
| 120 | |
| 121 | def match_using_filename(self, file_names_a, file_names_b): |
| 122 | file_names_b_set = set(file_names_b) |
| 123 | matched_file_name = [] |
| 124 | for file_name in file_names_a: |
| 125 | if file_name not in file_names_b_set: |
| 126 | matched_file_name.append(None) |
| 127 | else: |
| 128 | matched_file_name.append(file_name) |
| 129 | return matched_file_name |
| 130 | |
| 131 | def match_using_numbers(self, file_names_a, file_names_b): |
| 132 | numbers_a = self.extract_number_from_filenames(file_names_a) |
| 133 | numbers_b = self.extract_number_from_filenames(file_names_b) |
| 134 | numbers_b_dict = {number: file_name for number, file_name in zip(numbers_b, file_names_b)} |
| 135 | matched_file_name = [] |
| 136 | for number in numbers_a: |
| 137 | if number in numbers_b_dict: |
| 138 | matched_file_name.append(numbers_b_dict[number]) |
| 139 | else: |
| 140 | matched_file_name.append(None) |
| 141 | return matched_file_name |
| 142 | |
| 143 | def match_filenames(self, file_names_a, file_names_b): |
| 144 | matched_file_name = self.match_using_filename(file_names_a, file_names_b) |
| 145 | if sum([i is not None for i in matched_file_name]) > 0: |
| 146 | return matched_file_name |
| 147 | matched_file_name = self.match_using_numbers(file_names_a, file_names_b) |
| 148 | return matched_file_name |
| 149 |
no outgoing calls
no test coverage detected