Mam dwa takie struny
string1="abc def ghi"
i
string2="def ghi abc"
Jak sprawić, by te dwa ciągi były takie same bez łamania słów?
python
string
python-2.7
string-comparison
user3064366
źródło
źródło
Odpowiedzi:
Wydaje się, że pytanie nie dotyczy równości łańcuchów, ale równości zbiorów . Możesz je porównać tylko w ten sposób , dzieląc ciągi i konwertując je na zestawy:
s1 = 'abc def ghi' s2 = 'def ghi abc' set1 = set(s1.split(' ')) set2 = set(s2.split(' ')) print set1 == set2
Wynik będzie
True
źródło
s1 = 'abc def ghi' s2 = 'def ghi Abc' set1 = set(map(lambda word: word.lower(),s1.split(' '))) set2 = set(map(lambda word: word.lower(),s2.split(' '))) print(set1 == set2)
Demomap
, jak można znormalizować łańcuchy sprawę podziałuJeśli chcesz wiedzieć, czy oba ciągi są równe, możesz po prostu to zrobić
print string1 == string2
Ale jeśli chcesz wiedzieć, czy oba mają ten sam zestaw znaków i występują one taką samą liczbę razy, możesz użyć w
collections.Counter
ten sposób>>> string1, string2 = "abc def ghi", "def ghi abc" >>> from collections import Counter >>> Counter(string1) == Counter(string2) True
źródło
>>> 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']
źródło
Coś takiego:
if string1 == string2: print 'they are the same'
aktualizacja: jeśli chcesz sprawdzić, czy każdy podciąg może istnieć w innym:
elem1 = [x for x in string1.split()] elem2 = [x for x in string2.split()] for item in elem1: if item in elem2: print item
źródło
W tym celu możesz użyć domyślnego difflib w Pythonie
from difflib import SequenceMatcher def similar(a, b): return SequenceMatcher(None, a, b).ratio()
następnie wywołaj podobne () jako
zwróci porównanie jako, stosunek> = próg, aby uzyskać wynik dopasowania
źródło
Równość w bezpośrednim porównywaniu:
string1 = "sample" string2 = "sample" if string1 == string2 : print("Strings are equal with text : ", string1," & " ,string2) else : print ("Strings are not equal")
Równość w zestawach znaków:
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")
źródło
Mam zamiar przedstawić kilka rozwiązań i możesz wybrać to, które spełnia Twoje potrzeby:
1) Jeśli interesują cię tylko znaki, tj. Te same znaki i mające równe częstotliwości każdego z nich w obu łańcuchach, użyj:
''.join(sorted(string1)).strip() == ''.join(sorted(string2)).strip()
2) Jeśli interesuje Cię również liczba spacji (białych znaków) w obu ciągach, po prostu użyj następującego fragmentu:
sorted(string1) == sorted(string2)
3) Jeśli rozważasz słowa, ale nie ich kolejność i sprawdzasz, czy oba ciągi mają równe częstotliwości słów, niezależnie od ich kolejności / występowania, możesz użyć:
sorted(string1.split()) == sorted(string2.split())
4) Rozszerzając powyższe, jeśli nie jesteś zainteresowany liczbą częstotliwości, ale po prostu musisz upewnić się, że oba ciągi zawierają ten sam zestaw słów, możesz użyć następującego:
set(string1.split()) == set(string2.split())
źródło
collection.Counter
wydaje się bardziej oczywisty niż użyciesorted
Jeśli chcesz tylko sprawdzić, czy dwa ciągi są dokładnie takie same,
text1 = 'apple' text2 = 'apple' text1 == text2
Wynik będzie
True
Jeśli potrzebujesz odpowiedniego odsetka,
import difflib text1 = 'Since 1958.' text2 = 'Since 1958' output = str(int(difflib.SequenceMatcher(None, text1, text2).ratio()*100))
Odpowiedni procent wyjściowy będzie:
'95'
źródło
Myślę, że difflib to dobra biblioteka do wykonywania tej pracy
>>>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']
źródło
otwórz oba pliki, a następnie porównaj je, dzieląc zawartość słów;
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
źródło
Jeśli chcesz naprawdę prostej odpowiedzi:
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")
źródło
Spróbuj zamienić oba ciągi na wielkie lub małe litery. Następnie możesz użyć
==
operatora porównania.źródło
To jest dość podstawowy przykład, ale po logicznych porównaniach (==) lub
string1.lower() == string2.lower()
, być może, może przydać się wypróbowanie niektórych podstawowych wskaźników odległości między dwoma ciągami.Możesz znaleźć wszędzie przykłady związane z tymi lub innymi metrykami, wypróbuj także pakiet fuzzywuzzy ( https://github.com/seatgeek/fuzzywuzzy ).
import Levenshtein import difflib print(Levenshtein.ratio('String1', 'String2')) print(difflib.SequenceMatcher(None, 'String1', 'String2').ratio())
źródło
Możesz użyć prostych pętli, aby sprawdzić, czy dwa ciągi są równe. Ale idealnie możesz użyć czegoś takiego jak return s1 == s2
s1 = 'hello' s2 = 'hello' a = [] for ele in s1: a.append(ele) for i in range(len(s2)): if a[i]==s2[i]: a.pop() if len(a)>0: return False else: return True
źródło