From 5155effbbf282b313576c1b011594e027c318e79 Mon Sep 17 00:00:00 2001 From: Justus Kuhlmann <82444481+jkuhl-uni@users.noreply.github.com> Date: Tue, 16 May 2023 19:28:32 +0200 Subject: [PATCH] Fix/sort names (#177) * cosmetic fix in sort_names * bug fix, more tests --- pyerrors/input/utils.py | 24 +++++++++++++----------- tests/utils_in_test.py | 25 ++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/pyerrors/input/utils.py b/pyerrors/input/utils.py index 6cabe0b5..f9eedd68 100644 --- a/pyerrors/input/utils.py +++ b/pyerrors/input/utils.py @@ -18,30 +18,32 @@ def sort_names(ll): sorted list """ if len(ll) > 1: + sorted = False r_pattern = r'r(\d+)' id_pattern = r'id(\d+)' # sort list by id first if all([re.search(id_pattern, entry) for entry in ll]): ll.sort(key=lambda x: int(re.findall(id_pattern, x)[0])) + sorted = True # then by replikum if all([re.search(r_pattern, entry) for entry in ll]): ll.sort(key=lambda x: int(re.findall(r_pattern, x)[0])) + sorted = True # as the rearrangements by one key let the other key untouched, the list is sorted now - else: + if not sorted: # fallback sames = '' - if len(ll) > 1: - for i in range(len(ll[0])): - checking = ll[0][i] - for rn in ll[1:]: - is_same = (rn[i] == checking) - if is_same: - sames += checking - else: - break - print("Using prefix:", ll[0][len(sames):]) + for i in range(len(ll[0])): + checking = ll[0][i] + for rn in ll[1:]: + is_same = (rn[i] == checking) + if is_same: + sames += checking + else: + break + print("Using prefix:", sames) ll.sort(key=lambda x: int(re.findall(r'\d+', x[len(sames):])[0])) return ll diff --git a/tests/utils_in_test.py b/tests/utils_in_test.py index 2b02a4aa..2d9917bf 100644 --- a/tests/utils_in_test.py +++ b/tests/utils_in_test.py @@ -6,4 +6,27 @@ def test_sort_names(): presorted_list = ['sfqcd_r1_id5', 'sfqcd_r2_id5', 'sfqcd_r2_id9', 'sfqcd_r7_id5', 'sfqcd_r10_id4', 'sfqcd_r10_id5'] sorted_list = pe.input.utils.sort_names(my_list) - assert (all([sorted_list[i] == presorted_list[i] for i in range(len(sorted_list))])) \ No newline at end of file + assert (all([sorted_list[i] == presorted_list[i] for i in range(len(sorted_list))])) + + +def test_sort_names_only_ids(): + my_list = ['sfcf_T_id2', 'sfcf_T_id1', 'sfcf_T_id0', 'sfcf_T_id6', 'sfcf_T_id5'] + presorted_list = ['sfcf_T_id0', 'sfcf_T_id1', 'sfcf_T_id2', 'sfcf_T_id5', 'sfcf_T_id6'] + + sorted_list = pe.input.utils.sort_names(my_list) + assert (all([sorted_list[i] == presorted_list[i] for i in range(len(sorted_list))])) + + +def test_sort_names_only_reps(): + my_list = ['sfcf_T_r2', 'sfcf_T_r1', 'sfcf_T_r0', 'sfcf_T_r6', 'sfcf_T_r5'] + presorted_list = ['sfcf_T_r0', 'sfcf_T_r1', 'sfcf_T_r2', 'sfcf_T_r5', 'sfcf_T_r6'] + + sorted_list = pe.input.utils.sort_names(my_list) + assert (all([sorted_list[i] == presorted_list[i] for i in range(len(sorted_list))])) + +def test_sort_names_fallback(): + my_list = ['xql2', 'xql1', 'xql0', 'xql6', 'xql5'] + presorted_list = ['xql0', 'xql1', 'xql2', 'xql5', 'xql6'] + + sorted_list = pe.input.utils.sort_names(my_list) + assert (all([sorted_list[i] == presorted_list[i] for i in range(len(sorted_list))]))