2013-12-03 2 views
0

Этот вопрос вдохновлен: Generating a list of repetitions regardless of the order и его принято отвечать: https://stackoverflow.com/a/20336020/1463143Концептуальное: Collect «синонимы» из списка «слов»

Проблема в этом вопросе не сформулирована должным образом, пожалуйста, голые со мной.

Здесь «алфавит» представляет собой любой набор букв, например. '012' или 'EDCRFV'

«слова» получены путем декартового произведения над алфавитом. Мы должны указать n для получения n-буквенных слов. Пример:

from itertools import product 
alphabet = '012' 
wordLen = 3 
wordList = [''.join(letter) for letter in product(alphabet,repeat=wordLen)] 
print wordList 

, который дает:

['000', '001', '002', '010', '011', '012', '020', '021', '022', '100', '101', '102', '110', '111', '112', '120', '121', '122', '200', '201', '202', '210', '211', '212', '220', '221', '222'] 

"синонимом" получается ... э-э ... если бы я только мог сформулировать это ...

эти списки содержат все возможные «синонимы» в рамках wordList:

['000', 
'111', 
'222'] 

['001', 
'002', 
'110', 
'112', 
'220', 
'221'] 

['010', 
'020', 
'101', 
'121', 
'202', 
'212'] 

['011', 
'022', 
'100', 
'122', 
'200', 
'211'] 

['012', 
'021', 
'102', 
'120', 
'201', 
'210'] 

к сожалению, я не могу выразить, как я получил а, перечислить списки «синонимов». Я хотел бы сделать что-то, как указано выше, для произвольного алфавита, образующего n-буквенные слова.

+4

* не в состоянии сформулировать, как я получил вышеуказанные списки «синонимов» *. К сожалению, мы тоже. Без каких-либо правил о том, как вы получили эти синонимы, мы остаемся в темноте, чтобы догадываться о соответствующих правилах. Я определенно не вижу никакой картины между синонимами. –

+0

@MartijnPieters Первый случай, все такие же, второй случай Первые два одинаковы, третий случай первый и последний одинаковы, 4-й случай второй и третий одинаковы, последний случай все разный – thefourtheye

+0

@thefourtheye: Действительно, этот шаблон кажется подходящим. Однако ОР должен был сформулировать это сам. –

ответ

3

Выглядит довольно просто:

syns = collections.defaultdict(list) 

for w in wordList: 
    hash = tuple(w.index(c) for c in w) 
    syns[hash].append(w) 

print syns.values() 
+0

просто возвышенным! – samkhan13

1

A:

[ word for word in wordList 
    if word[0] == word[1] 
    and word[0] == word[2] ] 

B:

[ word for word in wordList 
    if word[0] == word[1] 
    and word[0] != word[2] ] 

C:

[ word for word in wordList 
    if word[0] != word[1] 
    and word[0] == word[2] ] 

D:

[ word for word in wordList 
    if word[0] != word[1] 
    and word[1] == word[2] ] 

E:

[ word for word in wordList 
    if word[0] != word[1] 
    and word[0] != word[2] ] 

Таким образом, его группы всех вариаций букв равенства в слове:
'ABC' -> а <> B, B = C, C < > a; a = b, b = c, c = a; и т.д ..

каждый пустой результат (напр: а <> Ь, Ь = с, с = а) исключается

+0

Я думаю, что это действительно достойная попытка. Я собираюсь попробовать это с большим алфавитом. Я принял ответ thg435, потому что он более pythonic. – samkhan13

+0

Я думаю, что я не понял ваш вопрос – akaRem

0

Кажется, правило, которое вы хотите (для больших n, а) заключается в следующем:

u слово является синонимом из v тогда и только тогда u может быть получена из v пути замены двух символов в алфавите, то есть все слова, полученные от перестановок все аЛФАВИТА будут синонимы.

Пример: Позвольте u = 001 и алфавит 012.

Существует шесть перестановок алфавита: '012', '021', '102', '120', '201', '210'. Карта u со всеми этими перестановками, чтобы получить синонимы к u:

'001' 
'002' 
'110' 
'112' 
'220' 
'221' 
Смежные вопросы