2017-03-20 1 views
3

2 개의 문자열을 사용하는 함수를 정의하려고합니다.이 두 함수를 비교하여 분석기가 아닐 경우 True를 반환합니다. 나는 콜렉션을 가져오고 싶지 않다.Python - 2 단어를 비교하여 분석기가 맞는지 확인하십시오.

문자열 1이 python과 문자열 2가 nohtyp 경우 그래서, 그것은 반환해야 True. 그렇지 않으면 분명히 false을 반환하십시오. 여기 내 코드는 지금까지 다음과 같습니다

def check_anagram(str1, str2): 
if len(str1) != len(str2): 
    return False 
else: 
    for i in range(0, len(str1), 1): 
     if i in range(0, len(str2), 1): 
      return True 
     else: 
      return False 

그것은 대부분의 경우 잘 작동하지만 str1과는 aaaaaaaaaabbbbbbbbbb과 STR2이 ababababbbababababab 때, 그것은 true를 반환하고 str1과는 xxxyyyxxx 때와 STR2는 또한, yyyxxxyyy입니다 True을 반환합니다.

이 두 가지 경우에는 False을 다시 실행해야하지만 잘 모르겠습니다. 아무도 도와 줄 수 있습니까?

+0

'리턴' '.join (분류 (STR1)) ==' '.join (분류 (STR2))'내 문제를 해결하기 – ryugie

답변

0

, 코드가 항상 True를 반환합니다.

for i in range(0, len(str1), 1): 

이는 문자열이 "파이썬"루프 이러한 'I'의 값을 가질 것이다 STR1의 길이의 범위에서 반복한다 : 0, 1, 2, 3, 4, 5 인 경우를 당신은

for i in str1: 

이 난의 값을 만들 것입니다 쓰기 모든 단일 문자를 반복 할 : 당신이 범위를 사용하는 경우 P, y는, T, H, O, N 또는

, 당신은 확인하실 수 있습니다 str1 [i]로 된 개별 문자. 다음과 같이 출력됩니다 : str1 [0] == "p", str1 [1] == "y"등

if 문에서 동일한 작업을하므로 범위에서 'i' (0, 6)은 i와 동일하다. 'i'의 첫 번째 값은 0이되고, 첫 번째 검사에서 if 문이 전달 된 후 이 반환됩니다.이 반환되면 루프가 종료됩니다. 즉,이 첫 번째 경우 만 확인합니다.

str1의 모든 문자를 확인하고, str2의 어느 위치에 있으면 str2에서 해당 인스턴스를 제거하고 다음 문자를 확인하십시오. 언제든지 문자가 str2에 없으면 False를 반환합니다. 모든 문자를 검사하고 False를 반환하지 않은 경우 True를 반환합니다.

문자열은 불변이므로 목록에 먼저 넣고 목록을 반복 할 수 있습니다. 다음 코드 밖으로

확인 :

def check_anagram(str1, str2): 
    if len(str1) != len(str2): 
     return False 
    else: 
     string1 = [x for x in str1] # put str1 in list string1 
     string2 = [x for x in str2] 
     for i in range(0, len(str2), 1): # iterate over the range (length) of str2 
      if string1[i] in string2: # if letter in position i of string1 occurs in string 2 then: 
       string2.remove(string1[i]) # remove that letter from the string2 list 
      else: 
       return False # if it does NOT occur in string2, it is NOT an anagram, so return false 
     return True # If the loop went correctly, return true 

편집 : 당신이 (공백 (스페이스)를 제거하기 때문에하려면 "ARS 마그나는" "아나그램"의 철자 바꾸기는하지만, 프로그램이 선택되지 않습니다 길이가 다르기 때문에 그것을 올리십시오) 당신은 처음에 이것을해야합니다. 문자열에서 공백 문자를 대체하는 것은 .replace (대체 할 내용, 바꾸기) 함수로 수행 할 수 있습니다. check_anagram 함수의 시작 부분에이 권리를 장소 :

str1 = str1.replace(" ", "") 
str2 = str2.replace(" ", "") 
+0

나는 이것이 내가 찾고 있었던 것이라고 생각한다. 고마워. – Auclown

0

str2가 존재하는지 확인한 후에 str2에서 문자를 제거하지 않기 때문에 두 개의 테스트 케이스가 true를 반환합니다. 그래서 예를 들어 다음과 같은 두 개의 문자열을 비교 : 그들은 분명히 아나그램하지 않기 때문에

str1 = aa

str2 = a 우리가, 당신의 비교 결과가 False 될 것으로 기대한다. 그러나 두 a 문자가 str1에 있는지 확인하려면 str2에도 a이 포함되어 있기 때문에 True을 반환합니다. 더 나은 (그리고 더 빠른) 방법은 문자열을 먼저 처리하는 것일 수 있습니다.

# return a dictionary, where each key is the 
# count of that letter in the string 
def process_str(str): 
    dic = {} 
    for letter in str: 
     if letter in dic: 
      dic[letter] += 1 
     else: 
      dic[letter] = 1 
    return dic 

def check_anagram(str1, str2): 
    dic1 = process_str(str1) 
    dic2 = process_str(str2) 

    # does every key in dic1 have a corresponding key in dic2? 
    for key in dic1: 
     if not key in dic2: 
      return False 
     if not dic1[key] == dic2[key]: 
      return False 

    # does every key in dic2 have a corresponding key in dic1? 
    for key in dic2: 
     if not key in dic1: 
      return False 
     if not dic1[key] == dic2[key]: 
      return False 

    return True 

트릭을 수행해야합니다.

def check_anagram(a = '', b = ''): 
    return sorted(a) == sorted(b) 

Test1 파일 :

a = "python" 
b = "nohtyp" 
print(check_anagram(a, b)) 

출력 :

>>> True 

0

나는 작업을 할 수있는 가장 사소한 방법은 당신의 문자열을 정렬 및 예제처럼 비교 생각 시험 2 :

,210

출력 :

>>> False 

테스트 3 :

a = "xxxyyyxxx" 
b = "yyyxxxyyy" 
print(check_anagram(a, b)) 

출력 :

현재
>>> False 
+1

가장 쉬운 방법! 고맙습니다. 하지만 내 할당을 처리하기 위해 '정렬'방법을 사용할 수 있는지 여부를 모른다. 그래도 고마워. – Auclown

+0

귀하는 귀하의 질문에 그런 말을하지 않았습니다. 하지만 여전히 정렬 된 문자열을 사용하여 처리하는 방법에 대한 아이디어가 있습니다. –

관련 문제