Fix/sort names (#177)

* cosmetic fix in sort_names

* bug fix, more tests
This commit is contained in:
Justus Kuhlmann 2023-05-16 19:28:32 +02:00 committed by GitHub
parent 15d07de87f
commit 5155effbbf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 12 deletions

View file

@ -18,30 +18,32 @@ def sort_names(ll):
sorted list sorted list
""" """
if len(ll) > 1: if len(ll) > 1:
sorted = False
r_pattern = r'r(\d+)' r_pattern = r'r(\d+)'
id_pattern = r'id(\d+)' id_pattern = r'id(\d+)'
# sort list by id first # sort list by id first
if all([re.search(id_pattern, entry) for entry in ll]): if all([re.search(id_pattern, entry) for entry in ll]):
ll.sort(key=lambda x: int(re.findall(id_pattern, x)[0])) ll.sort(key=lambda x: int(re.findall(id_pattern, x)[0]))
sorted = True
# then by replikum # then by replikum
if all([re.search(r_pattern, entry) for entry in ll]): if all([re.search(r_pattern, entry) for entry in ll]):
ll.sort(key=lambda x: int(re.findall(r_pattern, x)[0])) 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 # as the rearrangements by one key let the other key untouched, the list is sorted now
else: if not sorted:
# fallback # fallback
sames = '' sames = ''
if len(ll) > 1: for i in range(len(ll[0])):
for i in range(len(ll[0])): checking = ll[0][i]
checking = ll[0][i] for rn in ll[1:]:
for rn in ll[1:]: is_same = (rn[i] == checking)
is_same = (rn[i] == checking) if is_same:
if is_same: sames += checking
sames += checking else:
else: break
break print("Using prefix:", sames)
print("Using prefix:", ll[0][len(sames):])
ll.sort(key=lambda x: int(re.findall(r'\d+', x[len(sames):])[0])) ll.sort(key=lambda x: int(re.findall(r'\d+', x[len(sames):])[0]))
return ll return ll

View file

@ -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'] 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) sorted_list = pe.input.utils.sort_names(my_list)
assert (all([sorted_list[i] == presorted_list[i] for i in range(len(sorted_list))])) 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))]))