স্ট্রিং প্রাকৃতিক সাজানোর জন্য একটি বিল্ট ইন ফাংশন আছে?


281

পাইথন ৩.x ব্যবহার করে আমার কাছে স্ট্রিংগুলির একটি তালিকা রয়েছে যার জন্য আমি প্রাকৃতিক বর্ণানুক্রমিক বাছাই করতে চাই।

প্রাকৃতিক বাছাই: উইন্ডোজের ফাইলগুলি বাছাই করার ক্রম।

উদাহরণস্বরূপ, নীচের তালিকাটি প্রাকৃতিকভাবে বাছাই করা হয়েছে (আমি যা চাই):

['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']

এবং উপরের তালিকার "সাজানো" সংস্করণটি এখানে (আমার কাছে কী আছে):

['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']

আমি একটি সাজানোর ফাংশন খুঁজছি যা প্রথমটির মতো আচরণ করে।


13
প্রাকৃতিক বাছাইয়ের সংজ্ঞাটি "উইন্ডোজ ফাইলগুলি সাজানোর ক্রম" নয়।
গ্লেন মেইনার্ড


যদি আপনি 'উইন্ডোজ-এক্সপ্লোরার-জাতীয়' বেশ কয়েকটি ক্ষেত্রে বাছাই করতে চান , উদাহরণস্বরূপ বাছাই করতে চান তবে এই সাইটের সমস্ত উত্তরই ভুল ফলাফল আনবে!1, 1, !a, a । উইন্ডোজের মতো বাছাইয়ের একমাত্র উপায় উইন্ডোজ StrCmpLogicalW ফাংশনটি নিজেই ব্যবহার করা বলে মনে হয় , যেহেতু কেউ এই ফাংশনটি সঠিকভাবে পুনরায় প্রয়োগ করেনি বলে মনে হয় না (উত্সটি প্রশংসা করবে)। সমাধান: stackoverflow.com/a/48030307/2441026
user136036

উত্তর:


235

পিপিআইতে এর জন্য তৃতীয় পক্ষের একটি লাইব্রেরি রয়েছে যাকে নাটসোর্ট বলে (সম্পূর্ণ প্রকাশ, আমি প্যাকেজের লেখক)। আপনার ক্ষেত্রে, আপনি নিম্নলিখিত দুটি করতে পারেন:

>>> from natsort import natsorted, ns
>>> x = ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
>>> natsorted(x, key=lambda y: y.lower())
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
>>> natsorted(x, alg=ns.IGNORECASE)  # or alg=ns.IC
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']

আপনার অবশ্যই লক্ষ্য করা উচিত যে natsortএকটি সাধারণ অ্যালগরিদম ব্যবহার করে তাই এটি আপনার ফেলে দেওয়া কোনও ইনপুটটির জন্য কাজ করা উচিত। আপনি যদি নিজের ফাংশন রোলিংয়ের চেয়ে আপনি কেন এটি করার জন্য কোনও গ্রন্থাগার বেছে নিতে পারেন তার আরও বিশদ জানতে চান, তবে natsortডকুমেন্টেশনের কীভাবে এটি কাজ করে পৃষ্ঠাটি দেখুন, বিশেষত সর্বত্র বিশেষ ক্ষেত্রে! অধ্যায়.


যদি আপনার বাছাই ফাংশনের পরিবর্তে বাছাই কী প্রয়োজন হয় তবে নীচের যে কোনও সূত্র ব্যবহার করুন।

>>> from natsort import natsort_keygen, ns
>>> l1 = ['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
>>> l2 = l1[:]
>>> natsort_key1 = natsort_keygen(key=lambda y: y.lower())
>>> l1.sort(key=natsort_key1)
>>> l1
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
>>> natsort_key2 = natsort_keygen(alg=ns.IGNORECASE)
>>> l2.sort(key=natsort_key2)
>>> l2
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']

5
আমি এটিও মনে করি এটি বেশ আকর্ষণীয় যে সংখ্যাটি শেষ না হলে নাটসোর্টও সঠিকভাবে সাজান: যেমন ফাইলের নামগুলির ক্ষেত্রে প্রায়শই এটি ঘটে। নিম্নলিখিত উদাহরণটি অন্তর্ভুক্ত নির্দ্বিধায় নির্ধারণ করুন: পেস্টবিন.com
মার্টিন থোমা

1
নাটসোর্ট একটি দুর্দান্ত পাঠাগার, পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে যুক্ত করা উচিত! :-)
মিচ ম্যাকম্যাবার্স

natsortএছাড়াও 'প্রাকৃতিকভাবে' স্ট্রিংয়ে একাধিক পৃথক সংখ্যার কেস পরিচালনা করে। দুর্দান্ত জিনিস!
ফ্লোরিয়ানএইচ

182

এটা চেষ্টা কর:

import re

def natural_sort(l): 
    convert = lambda text: int(text) if text.isdigit() else text.lower() 
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
    return sorted(l, key = alphanum_key)

আউটপুট:

['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']

কোডটি এখান থেকে রূপান্তরিত হয়েছে: মানুষের জন্য বাছাই করা: প্রাকৃতিক বাছাই অর্ডার


2
আপনি return sorted(l, key)পরিবর্তে ব্যবহার করবেন না কেন l.sort(key)? এটি কি কোনও পারফরম্যান্স লাভের জন্য নাকি আরও বেশি পাইথোনিক হতে পারে?
jperelli

12
@jperelli আমি মনে করি মই কলারের মূল তালিকাটি পরিবর্তন করবে। তবে সম্ভবত কলার তালিকার আরও একটি অগভীর অনুলিপি চান।
হুগি

3
কেবল রেকর্ডের জন্য, এটি সমস্ত ইনপুট পরিচালনা করতে পারে না: স্ট্রিং / ইন্টি স্প্লিটগুলি অবশ্যই লাইন করতে হবে, অন্যথায় আপনি ইনপুটটির জন্য ["foo", 0] <[0, "foo"] এর মতো তুলনা তৈরি করবেন ["foo0] "," 0foo "], যা একটি টাইপরর উত্থাপন করে।
ব্যবহারকারী19087

4
@ user19087: আসলে এটি কাজ করে, কারণ re.split('([0-9]+)', '0foo')প্রত্যাবর্তন ['', '0', 'foo']। তার কারণে, স্ট্রিংগুলি সর্বদা সূচকগুলিতে এবং অ্যারেতে বিজোড় সূচকগুলিতে পূর্ণসংখ্যার মধ্যে থাকবে।
ফ্লোরিয়ান কুশ্ছে

কর্মক্ষমতা সম্পর্কে যে কেউ ভাবছেন, এটি অজগরটির স্থানীয় বাছাইয়ের চেয়ে ধীরে ধীরে ধীরে ধীরে। অর্থাত্ 25 -50x ধীর। এবং আপনি যদি সর্বদা [elm1, elm2, Elm2, elm2] কে [elm1, Elm2, elm2, elm2] নির্ভরযোগ্যভাবে (নিম্নের ক্যাপগুলি) সারণি করতে চান তবে আপনি কেবল প্রাকৃতিক_সোর্টকে (সাজানো (lst)) কল করতে পারেন। আরও অদক্ষ, তবে পুনরাবৃত্তিযোগ্য বাছাই করা খুব সহজ। ~ 50% গতির জন্য রেজেক্স কম্পাইল করুন। যেমনটি ক্লডিউয়ের উত্তরে দেখা গেছে।
চার্লি হ্যালি

99

এখানে মার্ক বাইরের উত্তরের আরও একটি অজগর সংস্করণ রয়েছে:

import re

def natural_sort_key(s, _nsre=re.compile('([0-9]+)')):
    return [int(text) if text.isdigit() else text.lower()
            for text in _nsre.split(s)]    

এখন এই ফাংশন কোনো ফাংশন এটা ব্যবহার করে, মত একটি গুরুত্বপূর্ণ হিসাবে ব্যবহার করা যেতে পারে list.sort, sorted, max, ইত্যাদি

ল্যাম্বদা হিসাবে:

lambda s: [int(t) if t.isdigit() else t.lower() for t in re.split('(\d+)', s)]

9
পুনরায় মডিউল প্রনয়ন এবং ক্যাশে স্বয়ংক্রিয়ভাবেই আপনার regexes, তাই precompile করার কোন প্রয়োজন নেই
Wim

1
@ উইম: এটি সর্বশেষ এক্স ব্যবহারগুলিকে ক্যাশে করে, তাই প্রযুক্তিগতভাবে এক্স + 5 রেজেক্সগুলি ব্যবহার করা সম্ভব এবং তারপরে একটি প্রাকৃতিক বাছাই করা বারবার করা যায়, এই সময়ে এটি ক্যাশে হবে না। তবে সম্ভবত দীর্ঘমেয়াদে নগন্য
ক্লাদিউ

আমি এটি করিনি, তবে সম্ভবত কারণটি হ'ল এটি নিয়মিত অজগর সাজানোর মতো টিপলগুলি পরিচালনা করতে পারে না।
আনফুন বিড়াল

1
এক্স ব্যবহারগুলির @Claudiu উল্লেখ হবে বলে মনে হচ্ছে 100 পাইথন 2.7 ও 512 পাইথন 3.4 তে। এবং আরও মনে রাখবেন যে সীমাটি পৌঁছে গেলে ক্যাশে সম্পূর্ণভাবে সাফ হয়ে যায় (সুতরাং এটি কেবল প্রবীণ নয় যা বাইরে ফেলে দেওয়া হয়)।
জিট্রাক্স

@ জিট্রাক্স কেন / কীভাবে সম্পূর্ণভাবে ক্যাশে সাফ করার অর্থ দেয়?
জোসচুয়া

19

আমি http://www.codinghorror.com/blog/2007/12/sorting-for-humans-n Natural-sort-order.html এর উপর ভিত্তি করে একটি ফাংশন লিখেছি যা এখনও আপনার নিজের 'কী' প্যারামিটারে পাস করার ক্ষমতা যুক্ত করে। আরও জটিল বস্তু (কেবল স্ট্রিং নয়) রয়েছে এমন একটি প্রাকৃতিক তালিকাগুলি সম্পাদনের জন্য আমার এটি প্রয়োজন।

import re

def natural_sort(list, key=lambda s:s):
    """
    Sort the list into natural alphanumeric order.
    """
    def get_alphanum_key_func(key):
        convert = lambda text: int(text) if text.isdigit() else text 
        return lambda s: [convert(c) for c in re.split('([0-9]+)', key(s))]
    sort_key = get_alphanum_key_func(key)
    list.sort(key=sort_key)

উদাহরণ স্বরূপ:

my_list = [{'name':'b'}, {'name':'10'}, {'name':'a'}, {'name':'1'}, {'name':'9'}]
natural_sort(my_list, key=lambda x: x['name'])
print my_list
[{'name': '1'}, {'name': '9'}, {'name': '10'}, {'name': 'a'}, {'name': 'b'}]

এটি করার একটি সহজ উপায় হ'ল সংজ্ঞায়িত করা natural_sort_keyএবং তারপরে একটি তালিকা বাছাই করার সময় আপনি আপনার কীগুলি চেইন করতে পারেন, যেমন:list.sort(key=lambda el: natural_sort_key(el['name']))
ক্লাদিউ

17
data = ['elm13', 'elm9', 'elm0', 'elm1', 'Elm11', 'Elm2', 'elm10']

এর ডেটা বিশ্লেষণ করা যাক। সমস্ত উপাদানের অঙ্কের ক্ষমতা 2 এবং সাধারণ আক্ষরিক অংশে 3 টি বর্ণ রয়েছে 'elm'

সুতরাং, উপাদানের সর্বাধিক দৈর্ঘ্য 5 sure নিশ্চিত করার জন্য আমরা এই মানটি বাড়াতে পারি (উদাহরণস্বরূপ, 8 এ)।

এটি মনে রেখে, আমরা একটি লাইন সমাধান পেয়েছি:

data.sort(key=lambda x: '{0:0>8}'.format(x).lower())

নিয়মিত প্রকাশ এবং বাহ্যিক গ্রন্থাগার ছাড়া!

print(data)

>>> ['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'elm13']

ব্যাখ্যা:

for elm in data:
    print('{0:0>8}'.format(elm).lower())

>>>
0000elm0
0000elm1
0000elm2
0000elm9
000elm10
000elm11
000elm13

1
এটি গতিশীল / অজানা দৈর্ঘ্যের ডেটা পরিচালনা করে না। এটি ডেটাগুলির জন্য অন্যান্য সমাধানগুলির চেয়ে পৃথকভাবে বাছাই করে যার শেষে থাকা বিপরীতে থাকা ডাটাগুলির মধ্যে সংখ্যা থাকে। * এটি অগত্যা অযাচিত নয় তবে আমি মনে করি এটি ভাল good
জেরোডজি

1
আপনার যদি ডায়নামিক দৈর্ঘ্যের ডেটা হ্যান্ডেল করার প্রয়োজন হয় width = max(data, key=len)তবে 8উপরের জন্য কী সাব-ইন করতে হবে তা গণনা করতে এবং তারপরে এটিকে ফর্ম্যাট স্ট্রিংয়ে সাব করতে পারেন'{0:0>{width}}'.format(x, width=width)
রোগানরতু

1
এই ফোরামে অন্য সকলের তুলনায় কেবল একটি সময়সীমা পরীক্ষা করে, এই সমাধানটি @ স্নাকিলি যে ধরণের ডেটা প্রক্রিয়াকরণের চেষ্টা করছে তার জন্য সবচেয়ে দ্রুত এবং সবচেয়ে কার্যকর
এসআর

13

প্রদত্ত:

data=['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']

সার্জোর সমাধানের মতো, বাহ্যিক লাইব্রেরিবিহীন 1- লাইনারটি হ'ল :

data.sort(key=lambda x : int(x[3:]))

অথবা

sorted_data=sorted(data, key=lambda x : int(x[3:]))

ব্যাখ্যা:

এই সমাধানটির মূল বৈশিষ্ট্যটি ব্যবহার করা হয়েছে বাছাইয়ের বাছাইয়ের জন্য নিযুক্ত করা হবে এমন একটি ফাংশন সংজ্ঞায়িত করতে । কারণ আমরা জানি যে প্রতিটি ডাটা এন্ট্রি 'এলম' এর আগে থাকে বাছাই করা ফাংশনটি তৃতীয় অক্ষরের পরে স্ট্রিংয়ের অংশটি পূর্ণসংখ্যায় রূপান্তর করে (যেমন int (x [3:]))। যদি ডেটাটির সংখ্যাসূচক অংশটি অন্য কোনও জায়গায় থাকে তবে ফাংশনের এই অংশটি পরিবর্তন করতে হবে।

চিয়ার্স


6
এবং এখন আরও কিছু * মার্জিত (পাইথোনিক) এর জন্য - একটি স্পর্শ

সেখানে অনেকগুলি বাস্তবায়ন রয়েছে, এবং কিছু নিকটে এসে পৌঁছানোর পরেও কেউই লৌকিক আধুনিক অজগর সত্ত্বাকে পুরোপুরি ধরেনি।

  • পাইথন ব্যবহার করে পরীক্ষিত (৩.৩.১)
  • এটি দেখানোর জন্য একটি অতিরিক্ত তালিকা অন্তর্ভুক্ত করে যখন সংখ্যাগুলি মধ্যম স্ট্রিং হয় it
  • তবে পরীক্ষা করিনি, আমি ধরে নিচ্ছি যে যদি আপনার তালিকাটি বিশাল আকারের হয় তবে আগে থেকে রেজেক্স সংকলন করা আরও দক্ষ হবে
    • আমি নিশ্চিত যে এটি ভুলভ্রান্ত ধারনা হলে কেউ আমাকে সংশোধন করবেন

Quicky
from re import compile, split    
dre = compile(r'(\d+)')
mylist.sort(key=lambda l: [int(s) if s.isdigit() else s.lower() for s in split(dre, l)])
ফুল কোড
#!/usr/bin/python3
# coding=utf-8
"""
Natural-Sort Test
"""

from re import compile, split

dre = compile(r'(\d+)')
mylist = ['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13', 'elm']
mylist2 = ['e0lm', 'e1lm', 'E2lm', 'e9lm', 'e10lm', 'E12lm', 'e13lm', 'elm', 'e01lm']

mylist.sort(key=lambda l: [int(s) if s.isdigit() else s.lower() for s in split(dre, l)])
mylist2.sort(key=lambda l: [int(s) if s.isdigit() else s.lower() for s in split(dre, l)])

print(mylist)  
  # ['elm', 'elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
print(mylist2)  
  # ['e0lm', 'e1lm', 'e01lm', 'E2lm', 'e9lm', 'e10lm', 'E12lm', 'e13lm', 'elm']

সাবধানতা অবলম্বন করার সময়

  • from os.path import split
    • আপনার আমদানি আলাদা করতে হবে

থেকে অনুপ্রেরণা


6

এই পোস্টের মান

আমার বক্তব্যটি হ'ল একটি রেইজেক্স সমাধান অফার করে যা সাধারণত প্রয়োগ করা যায়।
আমি তিনটি ফাংশন তৈরি করব:

  1. find_first_digitযা আমি @ অনুরাগ ইউনিয়ালের কাছ থেকে ধার নিয়েছি । এটি একটি স্ট্রিংয়ে প্রথম অঙ্ক বা অ-অঙ্কের অবস্থান খুঁজে পাবে।
  2. split_digitsযা এমন একটি জেনারেটর যা একটি স্ট্রিংটিকে ডিজিট এবং অ-ডিজিটিক অংশগুলিতে আলাদা করে দেয়। এটি yieldযখন একটি অঙ্ক হয় তখন এটি পূর্ণসংখ্যাও করবে ।
  3. natural_keyশুধু split_digitsএকটি মধ্যে আবৃত tuple। এটা কি আমরা এর জন্য একটি কী হিসাবে ব্যবহার হয় sorted, max, min

ক্রিয়াকলাপ

def find_first_digit(s, non=False):
    for i, x in enumerate(s):
        if x.isdigit() ^ non:
            return i
    return -1

def split_digits(s, case=False):
    non = True
    while s:
        i = find_first_digit(s, non)
        if i == 0:
            non = not non
        elif i == -1:
            yield int(s) if s.isdigit() else s if case else s.lower()
            s = ''
        else:
            x, s = s[:i], s[i:]
            yield int(x) if x.isdigit() else x if case else x.lower()

def natural_key(s, *args, **kwargs):
    return tuple(split_digits(s, *args, **kwargs))

আমরা দেখতে পাচ্ছি যে এটি সাধারণ যে আমাদের একাধিক ডিজিট খণ্ড থাকতে পারে:

# Note that the key has lower case letters
natural_key('asl;dkfDFKJ:sdlkfjdf809lkasdjfa_543_hh')

('asl;dkfdfkj:sdlkfjdf', 809, 'lkasdjfa_', 543, '_hh')

বা সংবেদনশীল হিসাবে ছেড়ে দিন:

natural_key('asl;dkfDFKJ:sdlkfjdf809lkasdjfa_543_hh', True)

('asl;dkfDFKJ:sdlkfjdf', 809, 'lkasdjfa_', 543, '_hh')

আমরা দেখতে পাচ্ছি যে এটি যথাযথ ক্রমে ওপি'র তালিকাটি সাজায়

sorted(
    ['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13'],
    key=natural_key
)

['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']

তবে এটি আরও জটিল তালিকাও পরিচালনা করতে পারে:

sorted(
    ['f_1', 'e_1', 'a_2', 'g_0', 'd_0_12:2', 'd_0_1_:2'],
    key=natural_key
)

['a_2', 'd_0_1_:2', 'd_0_12:2', 'e_1', 'f_1', 'g_0']

আমার regex সমতুল্য হবে

def int_maybe(x):
    return int(x) if str(x).isdigit() else x

def split_digits_re(s, case=False):
    parts = re.findall('\d+|\D+', s)
    if not case:
        return map(int_maybe, (x.lower() for x in parts))
    else:
        return map(int_maybe, parts)
    
def natural_key_re(s, *args, **kwargs):
    return tuple(split_digits_re(s, *args, **kwargs))

1
অনেক ধন্যবাদ! তবে আমি যুক্ত করতে চাই যে আপনার যদি "12345_A" এবং "12345_A2" থাকে তবে প্রথমটি প্রথমটির আগে সাজানো হবে। উইন্ডোজ এটি কী করে তা এটি অন্তত নয়। তবুও উপরের সমস্যার জন্য কাজ করে, যদিও!
morph3us

4

একটি বিকল্প হ'ল স্ট্রিংটিকে একটি টিউপলে পরিণত করা এবং প্রসারিত ফর্ম ব্যবহার করে অঙ্কগুলি প্রতিস্থাপন করা করুন http://wiki.answers.com/Q/What_does_expanded_form_mean

এভাবে a90 হয়ে যাবে ("a", 90,0) এবং a1 হয়ে যাবে ("a", 1)

নীচে কিছু নমুনা কোড দেওয়া হয়েছে (যা এটি সংখ্যা থেকে শীর্ষস্থানীয় 0 গুলি সরিয়ে দেওয়ার কারণে খুব কার্যকর নয়)

alist=["something1",
    "something12",
    "something17",
    "something2",
    "something25and_then_33",
    "something25and_then_34",
    "something29",
    "beta1.1",
    "beta2.3.0",
    "beta2.33.1",
    "a001",
    "a2",
    "z002",
    "z1"]

def key(k):
    nums=set(list("0123456789"))
        chars=set(list(k))
    chars=chars-nums
    for i in range(len(k)):
        for c in chars:
            k=k.replace(c+"0",c)
    l=list(k)
    base=10
    j=0
    for i in range(len(l)-1,-1,-1):
        try:
            l[i]=int(l[i])*base**j
            j+=1
        except:
            j=0
    l=tuple(l)
    print l
    return l

print sorted(alist,key=key)

আউটপুট:

('s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', 1)
('s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', 10, 2)
('s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', 10, 7)
('s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', 2)
('s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', 20, 5, 'a', 'n', 'd', '_', 't', 'h', 'e', 'n', '_', 30, 3)
('s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', 20, 5, 'a', 'n', 'd', '_', 't', 'h', 'e', 'n', '_', 30, 4)
('s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g', 20, 9)
('b', 'e', 't', 'a', 1, '.', 1)
('b', 'e', 't', 'a', 2, '.', 3, '.')
('b', 'e', 't', 'a', 2, '.', 30, 3, '.', 1)
('a', 1)
('a', 2)
('z', 2)
('z', 1)
['a001', 'a2', 'beta1.1', 'beta2.3.0', 'beta2.33.1', 'something1', 'something2', 'something12', 'something17', 'something25and_then_33', 'something25and_then_34', 'something29', 'z1', 'z002']

1
দুর্ভাগ্যক্রমে, এই সমাধানটি কেবল পাইথন ২ এক্স এর জন্য কাজ করে। পাইথন 3 এর জন্য, ('b', 1) < ('b', 'e', 't', 'a', 1, '.', 1)ফিরে আসবেTypeError: unorderable types: int() < str()
শেঠমোর্টন

@ শেঠমমর্গন ঠিক আছে, পাইথন 3 এ এই কোডটি সহজেই ভেঙে যায় প্রাকৃতিক বিকল্প বলে মনে হয় natsort, পাইপ.আই.আর
প্রকল্প /

3

উত্তরের উপর ভিত্তি করে, আমি একটি natural_sortedফাংশন লিখেছিলাম যা অন্তর্নির্মিত ফাংশনের মতো আচরণ করে sorted:

# Copyright (C) 2018, Benjamin Drung <bdrung@posteo.de>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

import re

def natural_sorted(iterable, key=None, reverse=False):
    """Return a new naturally sorted list from the items in *iterable*.

    The returned list is in natural sort order. The string is ordered
    lexicographically (using the Unicode code point number to order individual
    characters), except that multi-digit numbers are ordered as a single
    character.

    Has two optional arguments which must be specified as keyword arguments.

    *key* specifies a function of one argument that is used to extract a
    comparison key from each list element: ``key=str.lower``.  The default value
    is ``None`` (compare the elements directly).

    *reverse* is a boolean value.  If set to ``True``, then the list elements are
    sorted as if each comparison were reversed.

    The :func:`natural_sorted` function is guaranteed to be stable. A sort is
    stable if it guarantees not to change the relative order of elements that
    compare equal --- this is helpful for sorting in multiple passes (for
    example, sort by department, then by salary grade).
    """
    prog = re.compile(r"(\d+)")

    def alphanum_key(element):
        """Split given key in list of strings and digits"""
        return [int(c) if c.isdigit() else c for c in prog.split(key(element)
                if key else element)]

    return sorted(iterable, key=alphanum_key, reverse=reverse)

সোর্স কোডটি আমার গিটহাব স্নিপেটস সংগ্রহস্থলটিতেও উপলভ্য: https://github.com/bdrung/snippets/blob/master/n Natural_sorted.py


2

উপরের উত্তরগুলি নির্দিষ্ট উদাহরণের জন্য ভাল যা প্রদর্শিত হয়েছিল, তবে প্রাকৃতিক সাজানোর আরও সাধারণ প্রশ্নের জন্য বেশ কয়েকটি দরকারী ক্ষেত্রে মিস করে। আমি কেবল সেগুলির একটির মধ্য দিয়ে কিছুটা পেরেছি, সুতরাং আরও বিশদ সমাধান তৈরি করেছি:

def natural_sort_key(string_or_number):
    """
    by Scott S. Lawton <scott@ProductArchitect.com> 2014-12-11; public domain and/or CC0 license

    handles cases where simple 'int' approach fails, e.g.
        ['0.501', '0.55'] floating point with different number of significant digits
        [0.01, 0.1, 1]    already numeric so regex and other string functions won't work (and aren't required)
        ['elm1', 'Elm2']  ASCII vs. letters (not case sensitive)
    """

    def try_float(astring):
        try:
            return float(astring)
        except:
            return astring

    if isinstance(string_or_number, basestring):
        string_or_number = string_or_number.lower()

        if len(re.findall('[.]\d', string_or_number)) <= 1:
            # assume a floating point value, e.g. to correctly sort ['0.501', '0.55']
            # '.' for decimal is locale-specific, e.g. correct for the Anglosphere and Asia but not continental Europe
            return [try_float(s) for s in re.split(r'([\d.]+)', string_or_number)]
        else:
            # assume distinct fields, e.g. IP address, phone number with '.', etc.
            # caveat: might want to first split by whitespace
            # TBD: for unicode, replace isdigit with isdecimal
            return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_or_number)]
    else:
        # consider: add code to recurse for lists/tuples and perhaps other iterables
        return string_or_number

পরীক্ষার কোড এবং কয়েকটি লিঙ্ক (স্ট্যাক ওভারফ্লো অফ এবং অফ) এখানে রয়েছে: http://productarchitect.com/code/better-natural-sort.py

মতামত স্বাগত। এটি একটি চূড়ান্ত সমাধান হতে বোঝায় না; মাত্র এক ধাপ এগিয়ে


আপনার পরীক্ষার স্ক্রিপ্টে যার সাথে আপনি লিঙ্ক করেছেন, natsortedএবং humansortedব্যর্থ হয়েছে কারণ সেগুলি ভুলভাবে ব্যবহৃত হয়েছিল ... আপনি natsortedকী হিসাবে পাস করার চেষ্টা করেছিলেন তবে এটি আসলে বাছাইয়ের কাজটি। আপনার চেষ্টা করা উচিত ছিল natsort_keygen()
শেঠমোর্টন

2

সম্ভবত functools.cmp_to_key()অজগর সাজানোর অন্তর্নিহিত বাস্তবায়নের সাথে ঘনিষ্ঠভাবে জড়িত। এছাড়াও, সিএমপি প্যারামিটারটি উত্তরাধিকার। আধুনিক উপায় হ'ল ইনপুট আইটেমগুলিকে এমন জিনিসগুলিতে রূপান্তর করা যা পছন্দসই সমৃদ্ধ তুলনা ক্রিয়াকে সমর্থন করে।

সিপিথন ২.x এর অধীনে, স্বতন্ত্র সমৃদ্ধ তুলনা অপারেটরগুলি বাস্তবায়ন না করা হলেও পৃথক প্রকারের বস্তুগুলির অর্ডার দেওয়া যেতে পারে। সিপিথন ৩.x এর অধীনে, বিভিন্ন ধরণের অবজেক্টের অবশ্যই তুলনাটি সমর্থন করতে হবে। দেখুন কিভাবে পাইথন তুলনা করা যায় স্ট্রিং এবং int? যা অফিসিয়াল ডকুমেন্টেশনের সাথে লিঙ্ক করে । উত্তরগুলির বেশিরভাগই এই অন্তর্নিহিত আদেশের উপর নির্ভর করে। পাইথন 3.x এ স্যুইচ করার জন্য সংখ্যা এবং স্ট্রিংয়ের মধ্যে তুলনাটি কার্যকর এবং একীকরণ করতে একটি নতুন ধরণের প্রয়োজন হবে।

Python 2.7.12 (default, Sep 29 2016, 13:30:34) 
>>> (0,"foo") < ("foo",0)
True  
Python 3.5.2 (default, Oct 14 2016, 12:54:53) 
>>> (0,"foo") < ("foo",0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  TypeError: unorderable types: int() < str()

তিনটি ভিন্ন পন্থা আছে। পাইথনের Iterableতুলনা অ্যালগরিদমের সুবিধা নেওয়ার জন্য প্রথম নেস্টেড ক্লাস ব্যবহার করে । দ্বিতীয়টি এই বাসাটিকে একটি একক শ্রেণিতে তালিকাভুক্ত করে। strপারফরম্যান্সের উপর ফোকাস করতে তৃতীয়টি সাবক্লাসিংয়ের প্রস্তাব করে। সব সময়সীমা; দ্বিতীয়টি দ্বিগুণ দ্রুত এবং তৃতীয়টি প্রায় ছয়গুণ দ্রুত। সাবক্লাসিংয়ের strপ্রয়োজন হয় না, এবং সম্ভবত এটি প্রথম দিক থেকে একটি খারাপ ধারণা ছিল, তবে এটি নির্দিষ্ট সুবিধা সহ আসে।

সাজানো অক্ষরগুলি কেস দ্বারা আদেশ জোর করে নকল করা হয়, এবং ছোট কেস লেটারকে প্রথমে বাছাই করতে কেস-অদলবদল করা হয়; এটি হ'ল "প্রাকৃতিক বাছাই" এর সাধারণ সংজ্ঞা। আমি গ্রুপিংয়ের ধরণ সম্পর্কে সিদ্ধান্ত নিতে পারিনি; কিছু নীচেরগুলি পছন্দ করতে পারে যা উল্লেখযোগ্য পারফরম্যান্স সুবিধাও নিয়ে আসে:

d = lambda s: s.lower()+s.swapcase()

যেখানে ব্যবহার করা হয়, তুলনা অপারেটরগুলি সেটিতে সেট করা থাকে objectতাই তারা এড়ানোfunctools.total_ordering হবে না ।

import functools
import itertools


@functools.total_ordering
class NaturalStringA(str):
    def __repr__(self):
        return "{}({})".format\
            ( type(self).__name__
            , super().__repr__()
            )
    d = lambda c, s: [ c.NaturalStringPart("".join(v))
                        for k,v in
                       itertools.groupby(s, c.isdigit)
                     ]
    d = classmethod(d)
    @functools.total_ordering
    class NaturalStringPart(str):
        d = lambda s: "".join(c.lower()+c.swapcase() for c in s)
        d = staticmethod(d)
        def __lt__(self, other):
            if not isinstance(self, type(other)):
                return NotImplemented
            try:
                return int(self) < int(other)
            except ValueError:
                if self.isdigit():
                    return True
                elif other.isdigit():
                    return False
                else:
                    return self.d(self) < self.d(other)
        def __eq__(self, other):
            if not isinstance(self, type(other)):
                return NotImplemented
            try:
                return int(self) == int(other)
            except ValueError:
                if self.isdigit() or other.isdigit():
                    return False
                else:
                    return self.d(self) == self.d(other)
        __le__ = object.__le__
        __ne__ = object.__ne__
        __gt__ = object.__gt__
        __ge__ = object.__ge__
    def __lt__(self, other):
        return self.d(self) < self.d(other)
    def __eq__(self, other):
        return self.d(self) == self.d(other)
    __le__ = object.__le__
    __ne__ = object.__ne__
    __gt__ = object.__gt__
    __ge__ = object.__ge__
import functools
import itertools


@functools.total_ordering
class NaturalStringB(str):
    def __repr__(self):
        return "{}({})".format\
            ( type(self).__name__
            , super().__repr__()
            )
    d = lambda s: "".join(c.lower()+c.swapcase() for c in s)
    d = staticmethod(d)
    def __lt__(self, other):
        if not isinstance(self, type(other)):
            return NotImplemented
        groups = map(lambda i: itertools.groupby(i, type(self).isdigit), (self, other))
        zipped = itertools.zip_longest(*groups)
        for s,o in zipped:
            if s is None:
                return True
            if o is None:
                return False
            s_k, s_v = s[0], "".join(s[1])
            o_k, o_v = o[0], "".join(o[1])
            if s_k and o_k:
                s_v, o_v = int(s_v), int(o_v)
                if s_v == o_v:
                    continue
                return s_v < o_v
            elif s_k:
                return True
            elif o_k:
                return False
            else:
                s_v, o_v = self.d(s_v), self.d(o_v)
                if s_v == o_v:
                    continue
                return s_v < o_v
        return False
    def __eq__(self, other):
        if not isinstance(self, type(other)):
            return NotImplemented
        groups = map(lambda i: itertools.groupby(i, type(self).isdigit), (self, other))
        zipped = itertools.zip_longest(*groups)
        for s,o in zipped:
            if s is None or o is None:
                return False
            s_k, s_v = s[0], "".join(s[1])
            o_k, o_v = o[0], "".join(o[1])
            if s_k and o_k:
                s_v, o_v = int(s_v), int(o_v)
                if s_v == o_v:
                    continue
                return False
            elif s_k or o_k:
                return False
            else:
                s_v, o_v = self.d(s_v), self.d(o_v)
                if s_v == o_v:
                    continue
                return False
        return True
    __le__ = object.__le__
    __ne__ = object.__ne__
    __gt__ = object.__gt__
    __ge__ = object.__ge__
import functools
import itertools
import enum


class OrderingType(enum.Enum):
    PerWordSwapCase         = lambda s: s.lower()+s.swapcase()
    PerCharacterSwapCase    = lambda s: "".join(c.lower()+c.swapcase() for c in s)


class NaturalOrdering:
    @classmethod
    def by(cls, ordering):
        def wrapper(string):
            return cls(string, ordering)
        return wrapper
    def __init__(self, string, ordering=OrderingType.PerCharacterSwapCase):
        self.string = string
        self.groups = [ (k,int("".join(v)))
                            if k else
                        (k,ordering("".join(v)))
                            for k,v in
                        itertools.groupby(string, str.isdigit)
                      ]
    def __repr__(self):
        return "{}({})".format\
            ( type(self).__name__
            , self.string
            )
    def __lesser(self, other, default):
        if not isinstance(self, type(other)):
            return NotImplemented
        for s,o in itertools.zip_longest(self.groups, other.groups):
            if s is None:
                return True
            if o is None:
                return False
            s_k, s_v = s
            o_k, o_v = o
            if s_k and o_k:
                if s_v == o_v:
                    continue
                return s_v < o_v
            elif s_k:
                return True
            elif o_k:
                return False
            else:
                if s_v == o_v:
                    continue
                return s_v < o_v
        return default
    def __lt__(self, other):
        return self.__lesser(other, default=False)
    def __le__(self, other):
        return self.__lesser(other, default=True)
    def __eq__(self, other):
        if not isinstance(self, type(other)):
            return NotImplemented
        for s,o in itertools.zip_longest(self.groups, other.groups):
            if s is None or o is None:
                return False
            s_k, s_v = s
            o_k, o_v = o
            if s_k and o_k:
                if s_v == o_v:
                    continue
                return False
            elif s_k or o_k:
                return False
            else:
                if s_v == o_v:
                    continue
                return False
        return True
    # functools.total_ordering doesn't create single-call wrappers if both
    # __le__ and __lt__ exist, so do it manually.
    def __gt__(self, other):
        op_result = self.__le__(other)
        if op_result is NotImplemented:
            return op_result
        return not op_result
    def __ge__(self, other):
        op_result = self.__lt__(other)
        if op_result is NotImplemented:
            return op_result
        return not op_result
    # __ne__ is the only implied ordering relationship, it automatically
    # delegates to __eq__
>>> import natsort
>>> import timeit
>>> l1 = ['Apple', 'corn', 'apPlE', 'arbour', 'Corn', 'Banana', 'apple', 'banana']
>>> l2 = list(map(str, range(30)))
>>> l3 = ["{} {}".format(x,y) for x in l1 for y in l2]
>>> print(timeit.timeit('sorted(l3+["0"], key=NaturalStringA)', number=10000, globals=globals()))
362.4729259099986
>>> print(timeit.timeit('sorted(l3+["0"], key=NaturalStringB)', number=10000, globals=globals()))
189.7340817489967
>>> print(timeit.timeit('sorted(l3+["0"], key=NaturalOrdering.by(OrderingType.PerCharacterSwapCase))', number=10000, globals=globals()))
69.34636392899847
>>> print(timeit.timeit('natsort.natsorted(l3+["0"], alg=natsort.ns.GROUPLETTERS | natsort.ns.LOWERCASEFIRST)', number=10000, globals=globals()))
98.2531585780016

প্রাকৃতিক বাছাই উভয়ই বেশ জটিল এবং অস্পষ্টভাবে একটি সমস্যা হিসাবে সংজ্ঞায়িত। unicodedata.normalize(...)আগে দৌড়াতে ভুলবেন না , এবং এর str.casefold()পরিবর্তে ব্যবহার বিবেচনা করুন str.lower()। সূক্ষ্ম এনকোডিংয়ের সমস্যাগুলি সম্ভবত আমি বিবেচনা করি নি। সুতরাং আমি স্থায়ীভাবে নেটসোর্ট লাইব্রেরির প্রস্তাব দিই । আমি গিথুব সংগ্রহস্থলের দিকে এক ঝলক দেখেছি; কোড রক্ষণাবেক্ষণ বড় হয়েছে।

আমি যে সমস্ত অ্যালগোরিদম দেখেছি সেগুলি অনুলিপি করা এবং অক্ষরগুলি হ্রাস করা এবং কেস অদলবদলের মতো কৌশলগুলির উপর নির্ভর করে। এটি চলমান সময়কে দ্বিগুণ করার সময়, কোনও বিকল্পের জন্য ইনপুট চরিত্রের সেটটিতে মোট প্রাকৃতিক ক্রম প্রয়োজন। আমি এটি ইউনিকোড স্পেসিফিকেশনের অংশ বলে মনে করি না, এবং যেহেতু আরও অনেক ইউনিকোড ডিজিট রয়েছে তাই এই [0-9]ধরণের বাছাই করা সমানভাবে উদ্বেগজনক হবে। আপনি লোকেল সচেতন তুলনা চান, সঙ্গে আপনার স্ট্রিং প্রস্তুত locale.strxfrmপাইথন এর প্রতি বাছাইকরণ কিভাবে


1

আমাকে এই প্রয়োজনীয়তাটি আমার নিজের হাতে জমা দিতে দাও:

from typing import Tuple, Union, Optional, Generator


StrOrInt = Union[str, int]


# On Python 3.6, string concatenation is REALLY fast
# Tested myself, and this fella also tested:
# https://blog.ganssle.io/articles/2019/11/string-concat.html
def griter(s: str) -> Generator[StrOrInt, None, None]:
    last_was_digit: Optional[bool] = None
    cluster: str = ""
    for c in s:
        if last_was_digit is None:
            last_was_digit = c.isdigit()
            cluster += c
            continue
        if c.isdigit() != last_was_digit:
            if last_was_digit:
                yield int(cluster)
            else:
                yield cluster
            last_was_digit = c.isdigit()
            cluster = ""
        cluster += c
    if last_was_digit:
        yield int(cluster)
    else:
        yield cluster
    return


def grouper(s: str) -> Tuple[StrOrInt, ...]:
    return tuple(griter(s))

এখন যদি আমাদের মতো তালিকা থাকে:

filelist = [
    'File3', 'File007', 'File3a', 'File10', 'File11', 'File1', 'File4', 'File5',
    'File9', 'File8', 'File8b1', 'File8b2', 'File8b11', 'File6'
]

key=প্রাকৃতিক বাছাই করতে আমরা কেবল কুয়ার্গটি ব্যবহার করতে পারি:

>>> sorted(filelist, key=grouper)
['File1', 'File3', 'File3a', 'File4', 'File5', 'File6', 'File007', 'File8', 
'File8b1', 'File8b2', 'File8b11', 'File9', 'File10', 'File11']

এখানে অপূর্ণতা অবশ্যই আছে, যেমন এটি এখন, ফাংশন ছোট হাতের অক্ষরের আগে বড় হাতের অক্ষর বাছাই করবে।

আমি কেস-সংবেদনশীল গ্রোপারের প্রয়োগ পাঠকের কাছে ছেড়ে দেব :-)


0

আমি আপনাকে আপনার পছন্দসই তালিকাটি অর্জন করতে মূল keyশব্দটির যুক্তিটি ব্যবহার করার পরামর্শ দিচ্ছি :sorted

to_order= [e2,E1,e5,E4,e3]
ordered= sorted(to_order, key= lambda x: x.lower())
    # ordered should be [E1,e2,e3,E4,e5]

1
এই সংখ্যাগুলি হ্যান্ডেল করে না। a_51পরে হবে a500, যদিও 500> 51
skjerns

সত্য, আমার উত্তরটি কেবল এলম 11 এবং এলম 1 এর প্রদত্ত উদাহরণের সাথে মেলে। বিশেষভাবে প্রাকৃতিক বাছাইয়ের জন্য অনুরোধটি মিস করেছেন এবং চিহ্নিত উত্তরটি সম্ভবত এখানে সেরা :) :)
জনি ভাকনিন ২

0

@ মার্ক বাইয়ার্সের উত্তর অনুসরণ করে, এখানে এমন একটি অভিযোজন রয়েছে যা keyপ্যারামিটারটি গ্রহণ করে এবং আরও পিইপি 8-অনুগত হয়।

def natsorted(seq, key=None):
    def convert(text):
        return int(text) if text.isdigit() else text

    def alphanum(obj):
        if key is not None:
            return [convert(c) for c in re.split(r'([0-9]+)', key(obj))]
        return [convert(c) for c in re.split(r'([0-9]+)', obj)]

    return sorted(seq, key=alphanum)

আমি একটি গিস্টও বানিয়েছি


(-1) এই উত্তরটি মার্কের তুলনায় নতুন কিছু আনবে না (কোনও লিটার PEP8-ify কিছু কোড করতে পারে)। বা keyপ্যারামিটার হতে পারে? তবে এটি @ beauburrier এর উত্তরে উদাহরণস্বরূপ
সিপ্রিয়ান টোমাইগা

0

মার্ক বাইয়ারের উত্তরে ক্লাউডিয়োর উন্নতি ;-)

import re

def natural_sort_key(s, _re=re.compile(r'(\d+)')):
    return [int(t) if i & 1 else t.lower() for i, t in enumerate(_re.split(s))]

...
my_naturally_sorted_list = sorted(my_list, key=natural_sort_key)

বিটিডাব্লু, সম্ভবত সবাই মনে রাখবেন না যে ফাংশন আর্গুমেন্ট ডিফল্টগুলি মূল্যায়ন করা হয় def সময়মতো


-1
a = ['H1', 'H100', 'H10', 'H3', 'H2', 'H6', 'H11', 'H50', 'H5', 'H99', 'H8']
b = ''
c = []

def bubble(bad_list):#bubble sort method
        length = len(bad_list) - 1
        sorted = False

        while not sorted:
                sorted = True
                for i in range(length):
                        if bad_list[i] > bad_list[i+1]:
                                sorted = False
                                bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i] #sort the integer list 
                                a[i], a[i+1] = a[i+1], a[i] #sort the main list based on the integer list index value

for a_string in a: #extract the number in the string character by character
        for letter in a_string:
                if letter.isdigit():
                        #print letter
                        b += letter
        c.append(b)
        b = ''

print 'Before sorting....'
print a
c = map(int, c) #converting string list into number list
print c
bubble(c)

print 'After sorting....'
print c
print a

প্রাপ্তি স্বীকার :

বুদ্বুদ বাছাই হোমওয়ার্ক

অজগরে একবারে একটি স্ট্রিংয়ের একটি অক্ষর কীভাবে পড়বেন


-2
>>> import re
>>> sorted(lst, key=lambda x: int(re.findall(r'\d+$', x)[0]))
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']

4
আপনার প্রয়োগটি কেবল সংখ্যাগুলির সমাধান করে। স্ট্রিংগুলির মধ্যে সংখ্যা না থাকলে বাস্তবায়ন ব্যর্থ হয়। উদাহরণস্বরূপ ['নীরব', 'ভূত'] এ চেষ্টা করুন (তালিকা সূচকের সীমার বাইরে নেই)।
স্নোকেলে

2
@ স্নাকলি: আপনার প্রশ্নটি শালীন উদাহরণ দেওয়ার ক্ষেত্রে ব্যর্থ হয়েছে। আপনি কী করতে চাইছেন তা আপনি ব্যাখ্যা করেননি এবং আপনি এই প্রশ্নটি নতুন তথ্য দিয়ে আপডেট করেছেন না। আপনি চেষ্টা করেছেন এমন কিছু আপনি পোস্ট করেন নি, তাই দয়া করে আমার টেলিপ্যাথি প্রচেষ্টাকে এড়িয়ে যাবেন না।
সাইলেন্টগোস্ট

5
@ সাইলেন্টগোস্ট: প্রথমে, আমি আপনাকে একটি উত্সাহ দিয়েছিলাম কারণ আমি মনে করি আপনার উত্তরটি কার্যকর (যদিও এটি আমার সমস্যার সমাধান করে না)। দ্বিতীয়ত, আমি উদাহরণ সহ সমস্ত সম্ভাব্য কেস কভার করতে পারি না। আমি মনে করি প্রাকৃতিক সাজানোর জন্য আমি একটি সুন্দর পরিষ্কার সংজ্ঞা দিয়েছি। আমি মনে করি না যে এত সহজ ধারণাটির জন্য একটি জটিল উদাহরণ বা দীর্ঘ সংজ্ঞা দেওয়া ভাল ধারণা idea আপনি যদি সমস্যার আরও ভাল গঠনের কথা ভাবতে পারেন তবে আমার প্রশ্নটি সম্পাদনা করতে আপনাকে স্বাগতম।
স্নাকাইল ile

1
@ সাইলেন্টগোস্ট: উইন্ডোজ যখন ফাইলের নাম অনুসারে বাছাই করে সে ক্ষেত্রে উইন্ডোজ যেমন ফাইল ফাইলের সাথে আচরণ করে তেমনি এই ধরণের স্ট্রিংগুলির সাথে মোকাবিলা করতে চাই (কেস ইত্যাদি উপেক্ষা করে)। এটি আমার কাছে স্পষ্ট বলে মনে হয় তবে আমি যা কিছু বলি তা আমার কাছে পরিষ্কার মনে হয়, সুতরাং আমি স্পষ্ট কিনা তা বিচার করব না।
স্নাকাইল

1
@ স্নাকিল আপনি প্রাকৃতিক সন্ধানের নিকটতম নিকটে আর কোথাও এসেছেন না। এটি করা বেশ শক্ত হবে এবং এর জন্য অনেক বিশদ প্রয়োজন। আপনি যদি উইন্ডোজ এক্সপ্লোরার দ্বারা সাজানো ক্রম চান তবে আপনি কি জানেন যে একটি সাধারণ এপিআই কল রয়েছে যা এটি সরবরাহ করে?
ডেভিড হেফারনান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.