Я хочу отсортировать набор строк (букв) переменной длины в n группах, основываясь на включении любых / всех / ни одной буквы из n заданных наборов.
Например, здесь я пытаюсь отсортировать все комбинации букв «A, B, P, Q, X» в 2 группы по следующим правилам: group1 должна включать все / любые из «A, P» ( но не 'B, Q'), группа 2 должна включать все / любые из 'B, Q' (но не 'A, P'). Моя конечная цель - создать список, в котором группы должны быть максимально разделены (например, начало и конец) со строками, не содержащими членов какой-либо группы в середине, за которыми следуют члены обеих групп и гибриды между серединой и крайностями. В идеале порядок будет таким: all-1 / none-2, some-1 / none-2, all-1 / some-2, none-1-2 / some-1-2, all-2 / some-1, некоторые-2 / нет-1, все-2 / нет-1.
labels_powerset = ['A','B','P','Q','X',
'AB','AP','AQ','AX','BP','BQ','BX','PQ','PX','QX',
'ABP','ABQ','ABX','APQ','APX','AQX','BPQ','BPX','BQX','PQX',
'ABPQ','ABPX','ABQX','APQX','BPQX','ABPQX']
labels_for_order = []
for length in range(1,len(max(labels_powerset,key=len))+1):
order = [label for label in labels_powerset if len(label)==length]
labels_for_order.append(order)
group1 = ['A','P']
group2 = ['B','Q']
all1 = [y for y in[[label for label in order if all(x in label for x in group1) and not any(y in label for y in group2)]
for order in labels_for_order]if y]
any1 = [y for y in[[label for label in order if any(x in label for x in group1) and not all(x in label for x in group1) and not any(y in label for y in group2)]
for order in labels_for_order]if y]
all2 = [y for y in[[label for label in order if all(x in label for x in group2) and not any(y in label for y in group1)]
for order in labels_for_order]if y]
any2 = [y for y in[[label for label in order if any(x in label for x in group2) and not all(x in label for x in group2) and not any(y in label for y in group1)]
for order in labels_for_order]if y]
none = [y for y in[[label for label in order if not any(x in label for x in group1) and not any(y in label for y in group2)]
for order in labels_for_order]if y]
both = [y for y in[[label for label in order if any(x in label for x in group1) and any(y in label for y in group2)]
for order in labels_for_order]if y]
both1 = [both[x] for x in range(0,int(len(both)/2))]
both2 = [both[x] for x in range(int(len(both)/2),len(both))]
sorted_labels = flatten(any1+all1+both1+none+both2+all2+any2)
Цель состоит в том, чтобы список был как можно более симметричным с точки зрения членства и длины строк.
Я довольно новичок в кодировании и кое-что прочитал на k-means, но не могу понять, как применить это к строкам букв.
Как мне сделать это более эффективно и так, чтобы это можно было обобщить на n групп / правил?