offset = 4 relation_first_grade = { 'f': ['Ur-Ur-Großmutter', 'Ur-Großmutter', 'Großmutter', 'Mutter', 'ich', 'Tochter', 'Enkelin', 'Ur-Enkelin', 'Ur-Ur-Enkelin'], 'm': ['Ur-Ur-Großvater', 'Ur-Großvater', 'Großvater', 'Vater', 'ich', 'Sohn', 'Enkel', 'Ur-Enkel', 'Ur-Ur-Enkel'] } relation_higher_grade = { 'f': ['Ur-Ur-Großtante', 'Ur-Großtante', 'Großtante', 'Tante', 'Cousine', 'Nichte', 'Großnichte', 'Ur-Großnichte', 'Ur-Ur-Großnichte'], 'm': ['Ur-Ur-Großonkel', 'Ur-Großonkel', 'Großonkel', 'Onkel', 'Cousin', 'Neffe', 'Großneffe', 'Ur-Großneffe', 'Ur-Ur-Großneffe'] } def relationship_name(subject, relative, gender): if gender != 'm': gender = 'f' s = subject.split('.') r = relative.split('.') delta = len(r) - len(s) if subject.startswith(relative) or relative.startswith(subject): return relation_first_grade[gender][delta + offset] common = relationship_grade(s, r) min_grade = min(len(s), len(r)) grade = min_grade - common if delta == 0: grade = grade - 1 if grade == 0: return 'Bruder' if (gender == 'm') else 'Schwester' if grade == 1: return relation_higher_grade[gender][delta + offset] return relation_higher_grade[gender][delta + offset] + f' {grade}. Grades' def relationship_grade(s, r): min_grade = min(len(s), len(r)) for i in range(min_grade): if s[i] != r[i]: return i return min_grade def relationship_distance(subject, relative): s = subject.split('.') r = relative.split('.') common = relationship_grade(s, r) grade = len(s) + len(r) - (2 * common) return grade def relationship_list(family_list, rel_index): subject = family_list[rel_index] result = [] for person in family_list: rel_name = relationship_name(subject[1], person[1], person[2]) rel_name2 = relationship_name(person[1], subject[1], subject[2]) dist = relationship_distance(subject[1], person[1]) result.append((*subject, rel_name2, *person, rel_name, dist)) return result def relationship_list_all(family_list): result = [] for i in range(len(family_list)): result.extend(relationship_list(family_list, i)) return result