2016-12-07 13 views
2

알파벳 순서로 단어 목록 L이 있습니다 (예 : hello = ehllo ) "blanagrams"라는 단어를 확인하려면 어떻게해야합니까? 예를 들어, 오케스트라는 오케스트라로 변합니다. 나는이 부분에 대해서만 생각할 수있었습니다. 나는 현재 단어의 모든 문자를 테스트하고이 단어가 다른 단어와 일치하는지 확인해야한다는 생각을 가지고있다. 그 단어가 블란 그램이고 사전을 만들지 만 코드에 넣으려고 애 쓰고있다.한 문자열의 문자가 다른 문자인지 확인하는 방법

L = [list of alphabetically ordered strings] 

for word in L: 

    for letter in word: 
     #confused at this part 
+2

더 나은 아이디어는 표현을 검사하기 위해'sets'와 같이 undestand order가없는 structures \ objects를 사용하는 것입니다. 'set (hello)'와'set (ehllo)'의 교차를 검사하는 것은 문자들을 한 단어에서 다른 단어로 재구성하려고 시도하는 것보다 쉽습니다. 하지만'sets'는 중복 된 엔트리를 허용하지 않으므로주의해야합니다. –

+1

먼저 두 단어를 비교해야하지만 코드에는 지금까지 하나만 있습니다. 또한, 모든 단어를 확인할 필요가 없으며, 다른 길이의 단어가 자동으로 실패하고, 맞습니까? 그런 다음 일치하지 않는 두 글자를 찾을 때까지 두 단어를 비교하면됩니다. – CAB

+0

AI에서 일반적으로 사용되는 사다리 게임의이 부분입니까? 인접 노드가있는 그래프를 사전이 아닌 가능한 단어로 만들려고하십니까? 당신의 질문을 정교하게 만드십시오. –

답변

0

이 일반적으로 AI에 사용되는 사다리 게임의 일부와 유사하다 가정하면, 당신은 가능한 한 단어가 아닌 사전 등의 인접 노드와 그래프를 만들려고하고 있습니다.

d = {} 
# create buckets of words that differ by one letter 
for word in L: 
    for i in range(len(word)): 
     bucket = word[:i] + '_' + word[i+1:] 
     if bucket in d: 
      d[bucket].append(word) 
     else: 
      d[bucket] = [word] 
+1

현재 N이라는 이름의 사전이 있습니다. "acehorrst"= [ "오케스트라", "carthorse"] 내가 생각하고있는 것은 사전 키를 비교하는 것입니다. acehorsst "를 내 사전의 다른 키와 비교합니다.한 문자를 제외한 모든 문자가 같은 경우 새 사전을 만듭니다. 여기서 "acehorsst"는 키이고 한 문자 만 제외하고 같은 단어가 값이되며 두 개 이상일 수 있습니다 말. 문제는, 어쨌든 나는 이것을하기 위해 고심하고있다. –

+0

지금 편집 된 버전을 확인하십시오. –

+0

약 250 만 단어 내 목록이 매우 오래 걸립니다. 이미 anagram을 찾는 프로그램이 있습니다. 나는 "acehorrst"= [ "오케스트라", "카트 호스"]에 대해 설명 했으므로, 예를 들어 blanagram (단어, 아나그램)과 같은 anagram을위한 anagrams 사전 ","carthorse ") 250 만 단어에 대해 단어는 사용자의 입력이므로"단어로 된 편지로 "를 생각한 다음 각 문자를 새로운 문자로 바꿔서 어떤 단어가 형성 될 수 있는지 확인하십시오 –

2
from collections import Counter 
def same_except1(s1, s2): 
    ct1, ct2 = Counter(s1), Counter(s2) 
    return sum((ct1 - ct2).values()) == 1 and sum((ct2 - ct1).values()) == 1 

예 :

>>> same_except1('hello', 'hella') 
True 
>>> same_except1('hello', 'heela') 
False 
>>> same_except1('hello', 'hello') 
False 
>>> same_except1('hello', 'helloa') 
False 
2

스티븐 Rumbalski의 대답은 나를 생각하고 카운터 (컬렉션의 사용에 +1이 작업을 수행하고 스파크에 감사 할 수있는 다른 방법도 거기있어 내 이자)

from collections import Counter 
def diff_one(w,z): 
    c=Counter(sorted(w+z)).values() 
    c=filter(lambda x:x%2!=0,c) 
    return len(c)==2 

기본적으로 일치하는 모든 문자는 짝수가 될 카운터 값을 갖습니다. 그래서 필터링하여 비교할 수없는 것들로 남겨 둡니다. 당신이 2보다 낫다면 당신은 문제가 있습니다.