পাইথন - দুটি স্ট্রিংয়ের মধ্যে পার্থক্য


90

আমি একটি তালিকায় প্রচুর শব্দ সঞ্চয় করতে চাই। এই শব্দগুলির মধ্যে অনেকগুলি একইরকম। উদাহরণ হিসেবে বলা যায় আমি শব্দ আছে afrykanerskojęzycznyমত শব্দের অনেক afrykanerskojęzycznym, afrykanerskojęzyczni, nieafrykanerskojęzyczni। দুটি স্ট্রিংয়ের মধ্যে পার্থক্য খুঁজে পাওয়া এবং প্রথমটি এবং ভিন্ন থেকে দ্বিতীয় স্ট্রিং পুনরুদ্ধার করার কার্যকর (দ্রুত এবং ছোট ডিফ আকারের) সমাধান কী?


4
"প্রথম থেকে আলাদা করে আলাদা করে আলাদা করুন"
jrd1

4
আমি বিশ্বাস করি তার অর্থ "দ্বিতীয় স্ট্রিংটি প্রথমটির মতো করুন"।
ইলিয়াস

4
@ ইলিয়াসবিনেভেডিজ, ঠিক :)
ব্যবহারকারী2626682

4
আপনি কি কিছু খুঁজছেন difflib? , যদি তাই হয়, দেখতে যেমন stackoverflow.com/questions/774316/...
torek

উত্তর:


113

এটি করার জন্য আপনি ডিফ্লিব মডিউলে এনডিফ ব্যবহার করতে পারেন । এটিতে একটি স্ট্রিংকে অন্য স্ট্রিংয়ে রূপান্তর করতে প্রয়োজনীয় সমস্ত তথ্য রয়েছে।

একটি সহজ উদাহরণ:

import difflib

cases=[('afrykanerskojęzyczny', 'afrykanerskojęzycznym'),
       ('afrykanerskojęzyczni', 'nieafrykanerskojęzyczni'),
       ('afrykanerskojęzycznym', 'afrykanerskojęzyczny'),
       ('nieafrykanerskojęzyczni', 'afrykanerskojęzyczni'),
       ('nieafrynerskojęzyczni', 'afrykanerskojzyczni'),
       ('abcdefg','xac')] 

for a,b in cases:     
    print('{} => {}'.format(a,b))  
    for i,s in enumerate(difflib.ndiff(a, b)):
        if s[0]==' ': continue
        elif s[0]=='-':
            print(u'Delete "{}" from position {}'.format(s[-1],i))
        elif s[0]=='+':
            print(u'Add "{}" to position {}'.format(s[-1],i))    
    print()      

মুদ্রণ:

afrykanerskojęzyczny => afrykanerskojęzycznym
Add "m" to position 20

afrykanerskojęzyczni => nieafrykanerskojęzyczni
Add "n" to position 0
Add "i" to position 1
Add "e" to position 2

afrykanerskojęzycznym => afrykanerskojęzyczny
Delete "m" from position 20

nieafrykanerskojęzyczni => afrykanerskojęzyczni
Delete "n" from position 0
Delete "i" from position 1
Delete "e" from position 2

nieafrynerskojęzyczni => afrykanerskojzyczni
Delete "n" from position 0
Delete "i" from position 1
Delete "e" from position 2
Add "k" to position 7
Add "a" to position 8
Delete "ę" from position 16

abcdefg => xac
Add "x" to position 0
Delete "b" from position 2
Delete "d" from position 4
Delete "e" from position 5
Delete "f" from position 6
Delete "g" from position 7

14
+1 টি পাইথন হয়েছে তাই অনেক দরকারী মডিউল। দেখে মনে হয় যে আমি প্রতিদিন একটি নতুন সম্পর্কে শিখি।
আর্শাজি

4
এটি ম্যানুয়ালি পার্থক্যের মধ্য দিয়ে পদক্ষেপ নিচ্ছে; দুটি স্ট্রিংয়ের মধ্যে পৃথক পুনরুদ্ধার করা অবশ্যই ডিফ্লিব্লিব.রেণীর
ডগ 25

ধন্যবাদ! তবে আমি নিশ্চিত নই যে এটি মেমরির দক্ষ কিনা। তালিকা (difflib.ndiff ("afrykanerskojęzyczny", "nieafrykanerskojęzyczny")) ['+ এন', '+ আই', '+ ই', 'এ', 'এফ', 'আর', 'y', 'কে' , 'এ', 'এন', 'ই', 'আর', 'এস', 'কে', 'ও', 'জে', 'ę', 'জে', 'ই', 'সি', ' z ',' n ',' y ']
ব্যবহারকারী2626682

ndiffএটি একটি জেনারেটর তাই এটি যথেষ্ট মেমরির দক্ষ। আপনি listএটিতে কল করছেন যা স্বতন্ত্রভাবে উত্পন্ন চরিত্রের তুলনাগুলিকে তাদের সম্পূর্ণ তালিকায় পরিণত করে। আপনি যদি একবার কল না listকরেন তবে আপনার কেবল একবারে কয়েকটি স্মৃতি থাকে ।
Dawg

4
পাইথন 2 তেও কাজ করে (আমার জন্য) আমি নির্দিষ্ট উত্স এবং নির্দিষ্ট আউটপুট দিয়ে একটি প্রশ্ন জিজ্ঞাসা করার পরামর্শ দেব। আমি মন্তব্যে ডিবাগ করতে পারি না ...
ডাঃ

26

আমি এনডিফ উত্তরটি পছন্দ করি তবে আপনি যদি কেবলমাত্র পরিবর্তনের তালিকায় এগুলি সবই ছুঁড়ে দিতে চান তবে আপনি কিছু করতে পারেন:

import difflib

case_a = 'afrykbnerskojęzyczny'
case_b = 'afrykanerskojęzycznym'

output_list = [li for li in difflib.ndiff(case_a, case_b) if li[0] != ' ']

4
আমি ঠিক এই জন্য গুগলিং করছিলাম। এক দ্রুত নোট, @Eric, আপনার ভেরিয়েবল আজ দেখানো হয়েছে মিলছে না, 20180905. হয় 1) গত লাইন পরিবর্তন output_list = [li for li in list(difflib.ndiff(case_a,case_b)) if li[0] != ' ']বা 2) হিসেবে পরিবর্তন স্ট্রিং ভেরিয়েবল নাম case_a -> aএবং case_b -> b। চিয়ার্স!
bবলldave025

4
এছাড়াও এটি আপনার কমান্ডের আউটপুট দেখানোর জন্য সহায়ক হতে পারে: >>> output_list; # ফলাফল #['- b', '+ a', '+ m']
bবলldave025

4
if not li.startswith(' ')কারও কারও মতাদর্শ if li[0] != ' 'এটিকে আরও সুস্পষ্ট বলে মনে হতে পারে। বা এমনকিif item.startswith(('-', '+', ))
dmmfll

@DMfll ডাউনভোট startswith()অজগর হিসাবে তালিকাগুলি নেই3.7.4
নাথান

3

আপনি রেজেক্স মডিউলটি দেখতে পাবেন (ফাজি বিভাগ)। আপনি প্রকৃত পার্থক্য পেতে পারেন কিনা তা আমি জানি না তবে অন্তত আপনি বিভিন্ন ধরণের পরিবর্তন যেমন সন্নিবেশ, মুছুন এবং বিকল্পগুলি নির্ধারণ করতে পারেন:

import regex
sequence = 'afrykanerskojezyczny'
queries = [ 'afrykanerskojezycznym', 'afrykanerskojezyczni', 
            'nieafrykanerskojezyczni' ]
for q in queries:
    m = regex.search(r'(%s){e<=2}'%q, sequence)
    print 'match' if m else 'nomatch'

3

আপনি যা জিজ্ঞাসা করছেন তা হ'ল সংক্ষেপণের একটি বিশেষ রূপ form xdelta3 এই বিশেষ ধরণের সংকোচনের জন্য ডিজাইন করা হয়েছিল এবং এর জন্য অজগর বাঁধাই রয়েছে তবে আপনি সম্ভবত সরাসরি জ্লিবিব ব্যবহার করে পালাতে পারবেন। আপনি ব্যবহার করতে চান zlib.compressobjএবং প্যারামিটারটি আপনার "বেস ওয়ার্ড" তে সেট zlib.decompressobjকরে zdictরেখেছেন, যেমন afrykanerskojęzyczny

ক্যাভেটগুলি zdictকেবল অজগর 3.3 এবং উচ্চতরতে সমর্থিত এবং কোডিং করা আপনার পক্ষে যদি আপনার সমস্ত ভিন্নতার জন্য একই "বেস শব্দ" থাকে তবে এটি সবচেয়ে সহজ যা আপনি যা চান তা হতে পারে বা নাও পারে।


-2

মূল প্রশ্নের উপরে আমার মন্তব্যের উত্তর আমাকে ভাবতে বাধ্য করে যে তিনি যা চান:

loopnum = 0
word = 'afrykanerskojęzyczny'
wordlist = ['afrykanerskojęzycznym','afrykanerskojęzyczni','nieafrykanerskojęzyczni']
for i in wordlist:
    wordlist[loopnum] = word
    loopnum += 1

এটি নিম্নলিখিতগুলি করবে:

ওয়ার্ডলিস্টে প্রতিটি মানের জন্য, শব্দ তালিকার সেই মানটিকে মূল কোডে সেট করুন।

আপনাকে যা করতে হবে তা হ'ল এই শব্দটির কোডটি যেখানে আপনাকে ওয়ার্ডলিস্ট পরিবর্তন করতে হবে তা নিশ্চিত করে আপনি শব্দ তালিকাতে পরিবর্তন করার জন্য প্রয়োজনীয় শব্দগুলি সংরক্ষণ করেছেন এবং মূল শব্দটি সঠিক।

আশাকরি এটা সাহায্য করবে!


ধন্যবাদ, তবে আসলে আমি 'afrykanerskojęzyczny' এর সাদৃশ্য ব্যবহার করে একটি স্মৃতি দক্ষ পদ্ধতিতে 'nieafrykanerskojęzyczni' এর মতো শব্দ সংরক্ষণ করতে চাই।
ব্যবহারকারী2626682
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.