web-dev-qa-db-fra.com

Comment comparer deux chaînes en python?

J'ai deux cordes comme

string1="abc def ghi"

et

string2="def ghi abc"

Comment faire pour que ces deux chaînes soient identiques sans casser les mots?

73
user3064366

Il semble que la question ne concerne pas l'égalité des chaînes, mais celle de ensembles. Vous pouvez les comparer de cette façon uniquement en scindant des chaînes et en les convertissant en ensembles:

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

Le résultat sera

True
60
oxfn

Si vous voulez savoir si les deux chaînes sont égales, vous pouvez simplement faire

_print string1 == string2
_

Mais si vous voulez savoir s'ils ont tous les deux le même jeu de caractères et qu'ils se produisent le même nombre de fois, vous pouvez utiliser collections.Counter , comme ceci

_>>> string1, string2 = "abc def ghi", "def ghi abc"
>>> from collections import Counter
>>> Counter(string1) == Counter(string2)
True
_
46
thefourtheye
>>> 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']
12
Tanveer Alam

Quelque chose comme ça:

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

pdate: si vous voulez voir si chaque sous-chaîne peut exister dans l'autre:

elem1 = [x for x in string1.split()]
elem2 = [x for x in string2.split()]

for item in elem1:
    if item in elem2:
        print item
7
philshem

Je vais vous proposer plusieurs solutions et vous pouvez choisir celle qui répond à vos besoins:

1) Si vous ne vous préoccupez que des caractères, c’est-à-dire des caractères identiques et ayant des fréquences égales de chacune des deux chaînes, utilisez:

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

2) Si vous êtes également préoccupé par le nombre d'espaces (caractères d'espacement) dans les deux chaînes, utilisez simplement l'extrait suivant:

sorted(string1) == sorted(string2)

3) Si vous envisagez des mots mais pas leur ordre et vérifiez si les deux chaînes ont des fréquences égales de mots, quel que soit leur ordre/occurrence, vous pouvez alors utiliser:

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

4) Étendre ce qui précède, si vous n'êtes pas concerné par le compte de fréquence, mais que vous devez simplement vous assurer que les deux chaînes contiennent le même set de mots, vous pouvez utiliser les éléments suivants:

set(string1.split()) == set(string2.split())
5
Archit Kapoor

Égalité en comparaison directe:

string1 = "sample"
string2 = "sample"

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

Égalité dans les jeux de caractères:

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")
5
A.G

Pour cela, vous pouvez utiliser difflib par défaut en python

from difflib import SequenceMatcher

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

puis appelez similar () as

similar(string1, string2)

il retournera compare as, ratio> = seuil pour obtenir le résultat de la correspondance

4
Basil Jose

Je pense que difflib est une bonne bibliothèque pour faire ce travail

   >>>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']
2
Asad

ouvrez les deux fichiers puis comparez-les en séparant son contenu Word;

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
1
Anum Sheraz

Ceci est un exemple assez basique, mais après les comparaisons logiques (==) ou string1.lower() == string2.lower(), peut-être utile d'essayer certaines des métriques de base des distances entre deux chaînes.

Vous pouvez trouver partout des exemples liés à ces métriques ou à d'autres, essayez également le package fuzzywuzzy ( https://github.com/seatgeek/fuzzywuzzy ).

import Levenshtein
import difflib

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

Essayez de convertir les deux chaînes en majuscules ou en minuscules. Ensuite, vous pouvez utiliser l'opérateur de comparaison ==.

0
Nishant Nawarkhede

Si vous voulez une réponse très 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")
0
Baalateja Kataru