¿Cómo comparo dos cadenas en python?

Tengo dos cuerdas como

string1="abc def ghi" 

y

 string2="def ghi abc" 

¿Cómo conseguir que estas dos cuerdas sean iguales sin romper las palabras?

Parece que la pregunta no se trata de la igualdad de cuerdas, sino de la igualdad de conjuntos . Puede compararlos de esta manera solo dividiendo cadenas y convirtiéndolas en conjuntos:

 s1 = 'abc def ghi' s2 = 'def ghi abc' set1 = set(s1.split(' ')) set2 = set(s2.split(' ')) print set1 == set2 

El resultado será

 True 

Si desea saber si ambas cadenas son iguales, simplemente puede hacer

 print string1 == string2 

Pero si desea saber si ambos tienen el mismo conjunto de caracteres y ocurren el mismo número de veces, puede usar collections.Counter .

 >>> string1, string2 = "abc def ghi", "def ghi abc" >>> from collections import Counter >>> Counter(string1) == Counter(string2) True 
 >>> s1="abc def ghi" >>> s2="def ghi abc" >>> s1 == s2 # For string comparison False >>> sorted(list(s1)) == sorted(list(s2)) # For comparing if they have same characters. True >>> sorted(list(s1)) [' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] >>> sorted(list(s2)) [' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] 

Algo como esto:

 if string1 == string2: print 'they are the same' 

actualización: si desea ver si cada subcadena puede existir en la otra:

 elem1 = [x for x in string1.split()] elem2 = [x for x in string2.split()] for item in elem1: if item in elem2: print item 

Voy a proporcionar varias soluciones y usted puede elegir la que satisfaga sus necesidades:

1) Si solo le interesan los caracteres, es decir, los mismos caracteres y tiene las mismas frecuencias en cada una de las cadenas, use:

 ''.join(sorted(string1)).strip() == ''.join(sorted(string2)).strip() 

2) Si también está preocupado por la cantidad de espacios (caracteres de espacio en blanco) en ambas cadenas, simplemente use el siguiente fragmento de código:

 sorted(string1) == sorted(string2) 

3) Si está considerando palabras pero no su orden y verifica si ambas cadenas tienen las mismas frecuencias de palabras, independientemente de su orden / ocurrencia, entonces puede usar:

 sorted(string1.split()) == sorted(string2.split()) 

4) Extendiendo lo anterior, si no está preocupado por el conteo de frecuencia, pero solo necesita asegurarse de que ambas cadenas contengan el mismo conjunto de palabras, entonces puede usar lo siguiente:

 set(string1.split()) == set(string2.split()) 

Igualdad en la comparación directa:

 string1 = "sample" string2 = "sample" if string1 == string2 : print("Strings are equal with text : ", string1," & " ,string2) else : print ("Strings are not equal") 

Igualdad en los juegos de caracteres:

 string1 = 'abc def ghi' string2 = 'def ghi abc' set1 = set(string1.split(' ')) set2 = set(string2.split(' ')) print set1 == set2 if string1 == string2 : print("Strings are equal with text : ", string1," & " ,string2) else : print ("Strings are not equal") 

Para eso, puedes usar difflib por defecto en python

 from difflib import SequenceMatcher def similar(a, b): return SequenceMatcher(None, a, b).ratio() 

entonces llama similar () como

 similar(string1, string2) 

volverá a comparar como, proporción> = umbral para obtener el resultado del partido

abra ambos archivos y luego compárelos dividiendo el contenido de sus palabras;

 log_file_A='file_A.txt' log_file_B='file_B.txt' read_A=open(log_file_A,'r') read_A=read_A.read() print read_A read_B=open(log_file_B,'r') read_B=read_B.read() print read_B File_A_set = set(read_A.split(' ')) File_A_set = set(read_B.split(' ')) print File_A_set == File_B_set 

Creo que Difflib es una buena biblioteca para hacer este trabajo.

  >>>import difflib >>> diff = difflib.Differ() >>> a='he is going home' >>> b='he is goes home' >>> list(diff.compare(a,b)) [' h', ' e', ' ', ' i', ' s', ' ', ' g', ' o', '+ e', '+ s', '- i', '- n', '- g', ' ', ' h', ' o', ' m', ' e'] >>> list(diff.compare(a.split(),b.split())) [' he', ' is', '- going', '+ goes', ' home'] 

Trate de convertir ambas cuerdas a mayúsculas o minúsculas. Entonces puedes usar el operador de comparación == .

Si quieres una respuesta realmente simple:

 s_1 = "abc def ghi" s_2 = "def ghi abc" flag = 0 for i in s_1: if i not in s_2: flag = 1 if flag == 0: print("a == b") else: print("a != b") 

Este es un ejemplo bastante básico, pero después de las comparaciones lógicas (==) o string1.lower() == string2.lower() , tal vez pueda ser útil probar algunas de las métricas básicas de distancias entre dos cadenas.

Puede encontrar ejemplos en todas partes relacionados con estas u otras métricas, pruebe también el paquete fuzzywuzzy ( https://github.com/seatgeek/fuzzywuzzy ).

 import Levenshtein import difflib print(Levenshtein.ratio('String1', 'String2')) print(difflib.SequenceMatcher(None, 'String1', 'String2').ratio())