удалить элементы из списка с идентичным символьным содержимым в python? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть следующий список

['KAK1K2', 'KAK1K3', 'KAK1K4', 'KAK1K5', 'KAK1K6', 'KAK2K1', 'KAK2K3', 'KAK2K4', 'KAK2K5', 'KAK2K6', 'KAK3K1', 'KAK3K2', 'KAK3K4', 'KAK3K5', 'KAK3K6', 'KAK4K1', 'KAK4K2', 'KAK4K3', 'KAK4K5', 'KAK4K6', 'KAK5K1'KAK5K2, KAK5K3, KAK5K4, KAK5K6, KAK6K1, KAK6K2, KAK6K3, KAK6K4, KAK6K5, K1KAK2, K1KAK3, K1KAKK, K1KAKK, «K1KAK6», «K1K2KA», «K1K2K3», «K1K2K4», «K1K2K5», «K1K2K6», «K1K3KA», «K1K3K2», «K1K3K4», «K1K3K5», «K1K3K4», «K1K3K4», K1K3K6K6K1K4K2' , 'K1K4K3', 'K1K4K5', 'K1K4K6', 'K1K5KA', 'K1K5K2', 'K1K5K3', 'K1K5K4', 'K1K5K6', 'K1K6KA', 'K1K6K2', 'K1K6K3', 'K1K6K4', K1K6K5, K2KAK1, K2KAK3, K2KAK4, K2KAK5, K2KAK6, K2K1KA, K2K1K3, K2K1K4, K2K1K5, K2K1K6, K2K1K6, K2K1K6K2K3K1 ',' K2K3K4 ',' K2K3K5 ',' K2K3K6 ',' K2K4KA ',' K2K4K1 ',' K2K4K3 ',' K2K4K5 ',' K2K4K6 ',' K2K5KA ',' K2K5K '' K2K5K5, K2K5K5, K2K5K5, K2K5K5, K2K5K5, K2K5K5, K2K5K5, K2K5K1, K2K5K5, K2K5K5, K2K5K5, K2K5K1, K2K5K5, K2K5K5, K2K5K1, K2K5K5, K2K5K1, K2K5, K2K5K6, K2K6KA, K2K6K1, K2K6K3, K2K6K4, K2K6K5, K3KAK1, K3KAK2, K3KAK4, K3KAK5, K3KAK3, K3KAK3KA ',' K3K1K2 ',' K3K1K4 ',' K3K1K5 ',' K3K1K6 ',' K3K2KA ',' K3K2K1 ',' K3K2K4 ',' K3K2K5 ',' K3K2K6 ',' K3K4KA ',' K2K4K ', K2K4K, «K3K4K5», «K3K4K6», «K3K5KA», «K3K5K1», «K3K5K2», «K3K5K4», «K3K5K6», «K3K6KA», «K3K6K1», «K3K6K2», «K3K6» K3K6K4K4К4КАК1 ',' К4КАК2 ',' К4КАК3 ',' К4КАК5 ',' К4КАК6 ',' К4К1КА ',' К4К1К2 ',' К4К1К3 ',' К4К1К5 ',' К4К1К6 ',' К4К2КА ',' К2К4К2К4К2К4К2, «K4K2K5», «K4K2K6», «K4K3KA», «K4K3K1», «K4K3K2», «K4K3K5», «K4K3K6», «K4K5KA», «K4K5K1», «K4K5K2», «K4K5», K4K5K3K3K4K6KA, K4K6K1, K4K6K2, K4K6K3, K4K6K5, K5KAK1, K5KAK2, K5KAK3, K5KAK4, K5KAK6, K5K1K5, K5K1K5, K5K1K5, «K5K1K4», «K5K1K6», «K5K2KA», «K5K2K1», «K5K2K3», «K5K2K4», «K5K2K6», «K5K3KA», «K5K3K1», «K5K3K2», «K5K3», K5K3K4K4K5K4KA, K5K4K1, K5K4K2, K5K4K3, K5K4K6, K5K6KA, K5K6K1, K5K6K2, K5K6K3, K5K6K4, K6K6K2, K6KAKK, K6KAK4, K6KAK5, K6K1KA, K6K1K2, K6K1K3, K6K1K4, K6K1K5, K6K2KA, K6K2K1, K6K2K3, K6K2K4, K6K2K4K6K3KA ',' K6K3K1 ',' K6K3K2 ',' K6K3K4 ',' K6K3K5 ',' K6K4KA ',' K6K4K1 ',' K6K4K2 ',' K6K4K3 ',' K6K4K5 ',' K6K5K ',' K5K5, 'K6K5K5, K5K5K5, 'K6K5K3', 'K6K5K4']

, сгенерированный с использованием этого кода:

atoms = ['KA', 'K1', 'K2','K3', 'K4', 'K5', 'K6']
combos = []

for e1 in atoms:
    for e2 in atoms:
        for e3 in atoms:
            if e1 != e2 != e3 != e1:
                combos.append(e1+e2+e3)

И я готов удалить избыточные элементы.Например, оставьте «KAK1K2» и удалите KAK2K1, «K1KAK2», «K1K2KA и т. Д.»

Большое спасибо

1 Ответ

0 голосов
/ 28 ноября 2018

Одним из решений было бы запомнить все known комбинации как frozenset и проверить, получили ли вы эту комбинацию.Добавляйте только, если нет:

atoms = ['KA', 'K1', 'K2','K3', 'K4', 'K5', 'K6']
combos = []
known = set()

for e1 in atoms:
    for e2 in atoms:
        for e3 in atoms:
            if e1 != e2 != e3 != e1:
                fz = frozenset( {e1,e2,e3})
                if fz not in known:
                    known.add(fz)
                    combos.append(e1+e2+e3)
print(combos)

['KAK1K2', 'KAK1K3', 'KAK1K4', 'KAK1K5', 'KAK1K6', 'KAK2K3', 'KAK2K4', 'KAK2K5', 
'KAK2K6', 'KAK3K4', 'KAK3K5', 'KAK3K6', 'KAK4K5', 'KAK4K6', 'KAK5K6', 'K1K2K3',
'K1K2K4', 'K1K2K5', 'K1K2K6', 'K1K3K4', 'K1K3K5', 'K1K3K6', 'K1K4K5', 'K1K4K6', 
'K1K5K6', 'K2K3K4', 'K2K3K5', 'K2K3K6', 'K2K4K5', 'K2K4K6', 'K2K5K6', 'K3K4K5', 
'K3K4K6', 'K3K5K6', 'K4K5K6']

Более короткий предложенный способ с использованием комбинаций itertools от Патрик Хау :

from itertools import combinations

combos = [''.join(x) for x in combinations(atoms,3)]
print(combos) 

['KAK1K2', 'KAK1K3', 'KAK1K4', 'KAK1K5', 'KAK1K6', 'KAK2K3', 'KAK2K4', 'KAK2K5',
'KAK2K6', 'KAK3K4', 'KAK3K5', 'KAK3K6', 'KAK4K5', 'KAK4K6', 'KAK5K6', 'K1K2K3',
'K1K2K4', 'K1K2K5', 'K1K2K6', 'K1K3K4', 'K1K3K5', 'K1K3K6', 'K1K4K5', 'K1K4K6', 
'K1K5K6', 'K2K3K4', 'K2K3K5', 'K2K3K6', 'K2K4K5', 'K2K4K6', 'K2K5K6', 'K3K4K5', 
'K3K4K6', 'K3K5K6', 'K4K5K6']
...