मैं अजगर में दो तारों की तुलना कैसे करूं?


86

मेरे पास दो तार हैं जैसे

string1="abc def ghi"

तथा

string2="def ghi abc"

यह कैसे प्राप्त करें कि यह दो स्ट्रिंग शब्दों को तोड़ने के बिना समान हैं?


13
आपका क्या मतलब है 'वही हैं'? तार की समानता की आपकी परिभाषा क्या है?
आयनॉक्स

41
वे दो तार समान नहीं हैं । महत्वपूर्ण में आदेश तार है।
jonrsharpe

8
यदि आपकी समस्या हल हो गई है, तो कृपया स्वीकार किए गए किसी भी उत्तर को चिह्नित करें
oxfn

जवाबों:


69

लगता है कि सवाल तार समानता के बारे में नहीं है, बल्कि सेट समानता का है। आप उन्हें इस तरह से केवल तारों को विभाजित करके और सेट करने के लिए परिवर्तित करके उनकी तुलना कर सकते हैं :

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

रिजल्ट होगा

True

1
लैम्ब्डा 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) डेमो
अभिजीत

@ अभिजीत को इसमें कोई आवश्यकता नहीं है map, क्योंकि आप बंटवारे से पहले तार के मामले को सामान्य कर सकते हैं
ऑक्सफेन

57

यदि आप जानना चाहते हैं कि क्या दोनों तार बराबर हैं, तो आप बस कर सकते हैं

print string1 == string2

लेकिन अगर आप को पता है कि वे दोनों पात्रों के एक ही सेट हो, तो चाहते हैं और वे कई बार एक ही नंबर होते हैं, तो आप उपयोग कर सकते हैं collections.Counterइस तरह,

>>> string1, string2 = "abc def ghi", "def ghi abc"
>>> from collections import Counter
>>> Counter(string1) == Counter(string2)
True

13
>>> 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']

8

कुछ इस तरह:

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

अद्यतन: यदि आप देखना चाहते हैं कि क्या प्रत्येक उप-स्ट्रिंग दूसरे में मौजूद हो सकती है:

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

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

8

उसके लिए, आप अजगर में डिफ़ॉल्ट डिफ्लिब का उपयोग कर सकते हैं

from difflib import SequenceMatcher

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

फिर इसी तरह () कॉल करें

similar(string1, string2)

मैच परिणाम प्राप्त करने के लिए इसकी तुलना अनुपात, = दहलीज से होगी


8

प्रत्यक्ष तुलना में समानता:

string1 = "sample"
string2 = "sample"

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

वर्ण सेट में समानता:

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

मैं कई समाधान प्रदान करने जा रहा हूं और आप अपनी जरूरतों को पूरा करने वाले को चुन सकते हैं:

1) यदि आप केवल पात्रों से संबंधित हैं, अर्थात, एक ही वर्ण और दोनों तारों में प्रत्येक की समान आवृत्तियाँ हैं, तो उपयोग करें:

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

2) यदि आप भी दोनों तारों में रिक्त स्थान की संख्या (सफेद अंतरिक्ष वर्ण) से संबंधित हैं, तो बस निम्नलिखित स्निपेट का उपयोग करें:

sorted(string1) == sorted(string2)

3) यदि आप शब्दों पर विचार कर रहे हैं, लेकिन उनके आदेश और जाँच पर विचार नहीं कर रहे हैं, यदि दोनों तारों में शब्दों की समान आवृत्तियाँ हैं, चाहे उनके आदेश / घटना की परवाह किए बिना, तो उपयोग कर सकते हैं:

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

4) उपरोक्त का विस्तार करते हुए, यदि आप फ़्रीक्वेंसी काउंट से चिंतित नहीं हैं, लेकिन आपको यह सुनिश्चित करने की ज़रूरत है कि दोनों स्ट्रिंग्स में शब्दों का एक ही सेट है, तो आप निम्न का उपयोग कर सकते हैं:

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

3 उपयोग के मामले के लिए उपयोग करने collection.Counter से ज्यादा स्पष्ट लगता हैsorted
Grijesh Chauhan

4

यदि आपको यह जांचने की आवश्यकता है कि क्या दो तार एक समान हैं,

text1 = 'apple'

text2 = 'apple'

text1 == text2

परिणाम होगा

True

यदि आपको मिलान प्रतिशत की आवश्यकता है,

import difflib

text1 = 'Since 1958.'

text2 = 'Since 1958'

output = str(int(difflib.SequenceMatcher(None, text1, text2).ratio()*100))

मिलान प्रतिशत उत्पादन होगा,

'95'

3

मुझे लगता है कि difflib इस काम को करने के लिए एक अच्छा पुस्तकालय है

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

1

दोनों फ़ाइलों को खोलें और फिर इसकी शब्द सामग्री को विभाजित करके उनकी तुलना करें;

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

यदि आप वास्तव में सरल उत्तर चाहते हैं:

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")

2
'==' ऑपरेटर का उपयोग करना यहाँ काफी आसान और सही उत्तर है।
हसीब मीर

1
@HaSeeBMiR और! = :)
प्रतिबद्ध 20

0

ऊपरी या निचले मामले में दोनों तारों को कवर करने का प्रयास करें। तब आप ==तुलना ऑपरेटर का उपयोग कर सकते हैं ।


0

यह एक बहुत ही बुनियादी उदाहरण है, लेकिन तार्किक तुलना (==) के बाद या string1.lower() == string2.lower(), शायद दो तारों के बीच की दूरी के कुछ बुनियादी मैट्रिक्स की कोशिश करने के लिए उपयोगी हो सकता है।

आप इन या कुछ अन्य मेट्रिक्स से संबंधित हर जगह के उदाहरण पा सकते हैं, फ़ज़ीविज़्ज़ी पैकेज ( https://github.com/seatgeek/fuzzywuzzy ) भी आज़माएं

import Levenshtein
import difflib

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

-3

आप दो छोरों के बराबर होने की जांच करने के लिए सरल छोरों का उपयोग कर सकते हैं। .लेकिन आदर्श रूप से आप रिटर्न 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.