সংখ্যার দিক দিয়ে স্ট্রিংগুলির একটি তালিকা বাছাই কিভাবে?


128

আমি জানি যে এটি তুচ্ছ মনে হলেও আমি বুঝতে পারি নি যে sort()পাইথনের কাজটি অদ্ভুত। আমার কাছে "সংখ্যার" একটি তালিকা রয়েছে যা প্রকৃতপক্ষে স্ট্রিং আকারে রয়েছে, তাই আমি প্রথমে সেগুলি ইনসে রূপান্তর করি, তারপরে একটি সাজানোর চেষ্টা করি।

list1=["1","10","3","22","23","4","2","200"]
for item in list1:
    item=int(item)

list1.sort()
print list1

আমাকে দেয়:

['1', '10', '2', '200', '22', '23', '3', '4']

আমি যা চাই তা হ'ল

['1','2','3','4','10','22','23','200']

আমি সংখ্যার সেটগুলি বাছাইয়ের সাথে যুক্ত কিছু অ্যালগরিদমের সন্ধান করেছি, তবে যেগুলি আমি পেয়েছি তা সমস্ত আলফানিউমেরিক সেট বাছাইয়ের সাথে জড়িত।

আমি জানি এটি সম্ভবত কোনও মস্তিষ্কের সমস্যা নয় তবে গুগল এবং আমার পাঠ্যপুস্তকটি .sort()ফাংশনটির চেয়ে কম বা কম দরকারী কিছু সরবরাহ করে না ।


9
নোট করুন যে আপনার লুপটি আমার সন্দেহ হয় যা আপনি এটি করেন বলে মনে করেন do
অগস্ট

1
কোনও সময় আপনি আপডেট করেন নি list1। আপনি কী ভাবছেন listযে আপডেট হচ্ছে?
এস .লট

তালিকা 1 = ['' 1 ',' 1.10 ',' 1.11 ',' 1.1 ',' 1.2 '] ইনপুট হিসাবে সরবরাহ করা হলে একই সমস্যা উত্থাপন করা হয়। ['1', '1.1', '1.2', '1.10', '1.1'] হিসাবে আউটপুট পাওয়ার পরিবর্তে আমি পাচ্ছি ['1', '1.1', '1.10', '1.11', '1.2' ]
সতীশ

2
অজগর 3 এ আপনি ব্যবহার করতে পারেনsorted(mylist)
আকিন হাওয়ান

উত্তর:


191

আপনি আসলে আপনার স্ট্রিংগুলিকে ইনসে রূপান্তর করেন নি। বা বরং, আপনি করেছেন তবে ফলাফলের সাথে আপনি কিছুই করেননি। আপনি যা চান তা হ'ল:

list1 = ["1","10","3","22","23","4","2","200"]
list1 = [int(x) for x in list1]
list1.sort()

যদি কোনও কারণে আপনাকে ইনসগুলির পরিবর্তে স্ট্রিংগুলি রাখা প্রয়োজন (সাধারণত একটি খারাপ ধারণা, তবে সম্ভবত আপনাকে শীর্ষস্থানীয় জিরো বা কিছু সংরক্ষণ করতে হবে), আপনি একটি মূল ফাংশন ব্যবহার করতে পারেন । sortএকটি নামযুক্ত প্যারামিটার নেয় key, যা এটি এমন একটি ফাংশন যা তুলনার আগে প্রতিটি উপাদানকে ডাকা হয়। মূল ফাংশনের রিটার্ন মানগুলি তালিকার তালিকার সরাসরি উপাদানগুলির সাথে তুলনা করার পরিবর্তে তুলনা করা হয়:

list1 = ["1","10","3","22","23","4","2","200"]
# call int(x) on each element before comparing it
list1.sort(key=int)

8
যখন আমি ২.7-তে কী = int চেষ্টা করি তখন আমি কিছুই পাই না
KI4JGT

1
এটি কাজ করে যদি তালিকার উপাদানটি "পূর্ণসংখ্যার" হিসাবে সংরক্ষণ করা হয় তবে ভাসমান মানগুলির ক্ষেত্রে কীভাবে পরিচালনা করা হবে? উদা।, তালিকা 1 = [1, 1.10, 1.11, 1.1, 1.2]
সতীশ

1
@ KI4JGT বাছাই পদ্ধতি তালিকা পরিবর্তন করে এবং কোনওটি প্রদান করে না। এর পরিবর্তে list1 = list1.sort(key=int), ন্যায়বিচার list1.sort(key=int)এবং তালিকা 1 ইতিমধ্যে বাছাই করা হবে।
জোশিয়ার যোদার

1
@ KI4JGT .sort () একটি স্থান অপারেটর, এটি কোনওটি ফেরত দেয় না, তালিকাটি সাজায়, আপনি সাজানো ()
শেরপ্যা

39

তোমার একটি ফাংশন পাস পারে keyথেকে প্যারামিটার পদ্ধতি । এটির সাহায্যে সিস্টেম x এর পরিবর্তে কী (x) অনুসারে বাছাই করবে।.sort

list1.sort(key=int)

বিটিডাব্লু, তালিকাটিকে স্থায়ীভাবে পূর্ণসংখ্যায় রূপান্তর করতে , ফাংশনটি ব্যবহার করুনmap

list1 = list(map(int, list1))   # you don't need to call list() in Python 2.x

বা তালিকা উপলব্ধি

list1 = [int(x) for x in list1]

21

আপনি যদি sorted()ফাংশনটি ব্যবহার করতে চান তবে :sorted(list1, key=int)

এটি একটি নতুন সাজানো তালিকা ফেরত দেয়।


1
সেট দিয়েও কাজ করে!
এমটি

12

পাইথনের ধরণ অদ্ভুত নয়। এটি কেবল এই কোড:

for item in list1:
   item=int(item)

আপনি যা ভাবেন তা করছেন না - itemতালিকায় আবার প্রতিস্থাপন করা হয় না, কেবল তা ফেলে দেওয়া হয়।

যাইহোক, সঠিক সমাধানটি key=intঅন্যরা আপনাকে যেমন দেখিয়েছে তেমন ব্যবহার করা।


12

আপনি এটি ব্যবহার করতে পারেন:

import re

def sort_human(l):
    convert = lambda text: float(text) if text.isdigit() else text
    alphanum = lambda key: [convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key)]
    l.sort(key=alphanum)
    return l

এটি অন্যান্য স্টাফের সাথে খুব মিল যা আপনি ইন্টারনেটে খুঁজে পেতে পারেন তবে পছন্দ মতো বর্ণমালার জন্যও কাজ করে [abc0.1, abc0.2, ...]


8

সিউমাস ক্যাম্পবেলের উত্তর পাইথন 2.x এ কাজ করে না। ফাংশন
list1 = sorted(list1, key=lambda e: int(e))ব্যবহার lambdaকরে ভাল কাজ করে।


8

আমি গতকাল একই সমস্যার কাছে এসেছি এবং [নাটসোর্ট] [1] নামে একটি মডিউল পেয়েছি, যা আপনার সমস্যার সমাধান করে। ব্যবহার করুন:

from natsort import natsorted # pip install natsort

# Example list of strings
a = ['1', '10', '2', '3', '11']

[In]  sorted(a)
[Out] ['1', '10', '11', '2', '3']

[In]  natsorted(a)
[Out] ['1', '2', '3', '10', '11']

# Your array may contain strings
[In]  natsorted(['string11', 'string3', 'string1', 'string10', 'string100'])
[Out] ['string1', 'string3', 'string10', 'string11', 'string100']

এটি সমান হিসাবে অভিধানের জন্যও কাজ করে sorted। [1]: https://pypi.org/project/natsort/


3

এটি ব্যবহার করে দেখুন, এটি তালিকাটিকে সাজানো ক্রম অনুসারে সাজিয়ে রাখবে (এই ক্ষেত্রে কোনও কী নির্দিষ্ট করার দরকার নেই):

প্রক্রিয়া

listB = [24, 13, -15, -36, 8, 22, 48, 25, 46, -9]
listC = sorted(listB, reverse=True) # listB remains untouched
print listC

আউটপুট:

 [48, 46, 25, 24, 22, 13, 8, -9, -15, -36]

0

সবচেয়ে সাম্প্রতিক সমাধানটি সঠিক। আপনি স্ট্রিং হিসাবে সমাধানগুলি পড়ছেন, সেক্ষেত্রে আদেশটি 1, তার পরে 100, তারপরে 104 এর পরে 2 হবে 21, তারপরে 2001001010, 3 এবং আরও

পরিবর্তে আপনার ইনপুটটি ইনট হিসাবে আবদ্ধ করতে হবে:

সাজানো স্ট্রিং:

stringList = (1, 10, 2, 21, 3)

সাজানো ints:

intList = (1, 2, 3, 10, 21)

কাস্ট করার জন্য, কেবল স্ট্রিংলিস্টটি ইনট (ব্লহব্লাহ) এর ভিতরে রাখুন।

আবার

stringList = (1, 10, 2, 21, 3)

newList = int (stringList)

print newList

=> returns (1, 2, 3, 10, 21) 

1
TypeError: int () আর্গুমেন্টটি অবশ্যই একটি স্ট্রিং বা একটি সংখ্যা হতে হবে, 'টিপল' নয়
সিস টিমারম্যান

এছাড়াও, আপনার স্ট্রিংলিস্টে স্ট্রিংগুলির কোট থাকা উচিত।
তেপীম্ম

2
এটি একটি হেলুভা পূর্বাভাস: "অতি সাম্প্রতিক সমাধানটি সঠিক" ")
গ্রিনএজজেড

0

যদি আপনি সংখ্যার স্ট্রিং ব্যবহার করতে চান তবে আমার কোডে প্রদর্শিত হিসাবে অন্য একটি তালিকা নেবেন এটি ভাল কাজ করবে।

list1=["1","10","3","22","23","4","2","200"]

k=[]    
for item in list1:    
    k.append(int(item))

k.sort()
print(k)
# [1, 2, 3, 4, 10, 22, 23, 200]

0

একটি সাংখ্যিক তালিকা বাছাই করার সহজ উপায়

numlists = ["5","50","7","51","87","97","53"]
results = list(map(int, numlists))
results.sort(reverse=False)
print(results)

-1

আসল সমস্যা হ'ল বর্ণানুক্রমিকভাবে জিনিস সাজান। সুতরাং আপনার যদি একটি তালিকা থাকে ['1', '2', '10', '19'] এবং রান সাজান আপনি ['1', '10' পেতে পারেন। '19', '2']। 10 হ'ল 2 এর আগে আসে কারণ এটি প্রথম চরিত্রটি দেখায় এবং সেখান থেকে শুরু করে বাছাই করে। পাইথনগুলিকে বেশিরভাগ পদ্ধতিগুলি ক্রমে জিনিসগুলি ফেরত দেয় বলে মনে হয়। উদাহরণস্বরূপ, যদি আপনার কাছে 1.jpg, 2.jpg ইত্যাদি হিসাবে লেবেলযুক্ত ফাইলগুলির সাথে abc নামের একটি ডিরেক্টরি থাকে তবে 15.jpg অবধি বলুন এবং আপনি file_list = os.listdir (abc) করেন তবে ফাইল তালিকাটি আপনার প্রত্যাশার পরিবর্তে আদেশ করা হয় না বরং বরং file_list = ['1.jpg', '11 .jpg '---' 15.jpg ',' 2.jpg]। ফাইলগুলি যে ক্রমে প্রক্রিয়াজাত হয় সেগুলি যদি গুরুত্বপূর্ণ হয় (সম্ভবত এই কারণেই আপনি তাদের সংখ্যাসূচকভাবে নাম রেখেছিলেন) আদেশটি আপনি কী ভাবেন তা সে রকম নয়। আপনি "জিরোস" প্যাডিং ব্যবহার করে এড়াতে পারেন। উদাহরণস্বরূপ, যদি আপনার তালিকার তালিকা থাকে = ['01', '03', '05', '10', '02', '04', '06] এবং আপনি এতে সাজান তবে আপনি যে আদেশটি চেয়েছিলেন তা পেয়ে যান। alist = ['01', '02' ইত্যাদি] কারণ প্রথম অক্ষরটি 0 হয় যা 1 এর আগে আসে list তালিকার বৃহত্তম মান দ্বারা আপনার প্রয়োজনীয় জিরো প্যাডিংয়ের পরিমাণ নির্ধারিত হয় example উদাহরণস্বরূপ যদি বৃহত্তমটি 100 এবং এর মধ্যে বলা হয় 1000 আপনাকে 001, 002 --- 010,011--100, 101 ইত্যাদি হিসাবে একক অঙ্কগুলি প্যাড করতে হবে 1000


-5
scores = ['91','89','87','86','85']
scores.sort()
print (scores)

এটি অজগর সংস্করণ 3 ব্যবহার করে আমার পক্ষে কাজ করেছে, যদিও এটি সংস্করণ 2-এ নেই।


3
সেখানে '11 এবং '100' দিয়ে বাছাই করার চেষ্টা করুন, যখন জিনিসগুলি আকর্ষণীয় হয়ে ওঠে।
Penz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.