संख्यात्मक रूप से स्ट्रिंग की सूची को कैसे सॉर्ट करें?


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

मैंने सांख्यिक सेटों को छाँटने से जुड़े कुछ एल्गोरिदम के लिए चारों ओर देखा है, लेकिन मैंने पाया कि सभी में अल्फ़ान्यूमेरिक सेटों को क्रमबद्ध करना शामिल है।

मुझे पता है कि यह शायद एक दिमागी समस्या नहीं है, लेकिन Google और मेरी पाठ्यपुस्तक .sort()फ़ंक्शन की तुलना में अधिक या कम उपयोगी कुछ भी प्रदान नहीं करती हैं ।


9
ध्यान दें कि आपके लूप के लिए वह नहीं है जो मुझे संदेह है कि आपको लगता है कि यह करता है।
डेनिस

1
कुछ ही समय में आप अद्यतन किया list1। आपको क्या लगा कि listअपडेट किया जा रहा है?
S.Lott

इसी तरह की समस्या तब होती है जब सूची 1 = ['1', '1.10', '1.11', '1.1', '1.2'] इनपुट के रूप में प्रदान की जाती है। आउटपुट के बजाय ['1', '1.1', '1.2', '1.10', '1.11'] के रूप में, मुझे ['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
जब मैं कुंजी की कोशिश करता हूँ = 2.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 () एक जगह ऑपरेटर में है, यह कोई नहीं लौटाता है, यह सूची को सॉर्ट करता है, आप सॉर्ट किए गए () का उपयोग करना चाहते हैं
sherpya

39

आप एक फ़ंक्शन को keyपैरामीटर में .sortविधि के लिए पास कर सकते हैं । इसके साथ, सिस्टम x के बजाय कुंजी (x) द्वारा सॉर्ट करेगा।

list1.sort(key=int)

BTW, सूची को पूर्णांक में स्थायी रूप से परिवर्तित करने के लिए, फ़ंक्शन का उपयोग करें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

सीमस कैंपबेल का जवाब python2.x पर काम नहीं करता है। फ़ंक्शन
list1 = sorted(list1, key=lambda e: int(e))का उपयोग lambdaकरना अच्छी तरह से काम करता है।


8

मैंने कल एक ही समस्या का सामना किया और एक मॉड्यूल पाया, जिसे [natsort] [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। [१]: 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 और इसके बाद।

आपको अपने इनपुट को एक int के बजाय CAST करना होगा:

छंटे हुए तार:

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

सॉर्ट किए गए इनट्स:

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 () तर्क एक स्ट्रिंग या एक संख्या होना चाहिए, न कि 'टपल'
Cees Timmerman

इसके अलावा, आपके स्ट्रिंगलिस्ट में तार के उद्धरण होने चाहिए।
तेइपेमम

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]। यदि जिस क्रम में फ़ाइलों को संसाधित किया जाता है वह महत्वपूर्ण है (संभवत: इसीलिए आपने उन्हें संख्यात्मक रूप से नाम दिया है) यह क्रम वह नहीं है जो आपको लगता है कि यह होगा। आप "शून्य" पैडिंग का उपयोग करके इससे बच सकते हैं। उदाहरण के लिए, यदि आपके पास एक सूची है alist = ['01', '03', '05', '10', '02', '04', '06] और आप इसे उस तरह से चलाते हैं जैसा आप चाहते थे। alist = ['01', '02' इत्यादि] क्योंकि पहला वर्ण 0 है जो 1 से पहले आता है। आपकी ज़रूरत के ज़ीरो पैडिंग की मात्रा सूची में सबसे बड़े मूल्य द्वारा निर्धारित की जाती है। उदाहरण के लिए यदि सबसे बड़ा 100 के बीच में है और 1000 आपको 001, 002 --- 010,011--100, 101 आदि के रूप में एकल अंकों को पैड करने की आवश्यकता है।


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

यह मेरे लिए अजगर संस्करण 3 का उपयोग कर काम करता है, हालांकि यह संस्करण 2 में नहीं था।


3
वहां '11 और '100' के साथ सॉर्ट करने की कोशिश करें, तभी चीजें दिलचस्प होती हैं।
पेनज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.