पायथन 3 एक सूची में बदल जाते हैं


178

मैं इसमें संख्याओं के साथ एक सूची बनाने की कोशिश कर रहा हूं 1-1000। जाहिर है यह लिखने / पढ़ने के लिए कष्टप्रद होगा, इसलिए मैं इसमें एक सीमा के साथ एक सूची बनाने का प्रयास कर रहा हूं। पायथन 2 में ऐसा लगता है कि:

some_list = range(1,1000)

काम किया होगा, लेकिन पायथन 3 में रेंज xrangeपायथन 2 के समान है ?

किसी को भी इस में कुछ जानकारी प्रदान कर सकते हैं?


1
भी, some_list[i] == i+1तो आप वास्तव में वैसे भी एक सूची की जरूरत नहीं है।
njzk2

1
@RikPoggi। उदाहरण के लिए, किसी को प्लॉटिंग फ़ंक्शन के लिए एक सूची की आपूर्ति करने की आवश्यकता हो सकती है। कभी-कभी एक सीमा पर्याप्त होगी, लेकिन एक सीमा को संक्षिप्त नहीं किया जा सकता है (इसलिए अपरिवर्तनीय है), इसलिए यदि आपको प्लॉट किए जा रहे सभी सूचियों में एक डिफ़ॉल्ट प्रारंभिक मान जोड़ने की आवश्यकता है, जिसे एक सूची में भी बदलने की आवश्यकता है।
शेरिल्होमन

जवाबों:


223

आप केवल श्रेणी ऑब्जेक्ट से एक सूची बना सकते हैं:

my_list = list(range(1, 1001))

यह आप इसे python2.x में जनरेटर के साथ भी कैसे करते हैं। आमतौर पर बोलते हुए, आपको संभवतः एक सूची की आवश्यकता नहीं है, क्योंकि आप my_list[i]अधिक कुशलता से ( i + 1) के मूल्य से आ सकते हैं , और यदि आपको इसके ऊपर पुनरावृति करने की आवश्यकता है, तो आप बस वापस गिर सकते हैं range

यह भी ध्यान दें कि python2.x पर, xrangeअभी भी अनुक्रमित 1 है । इसका मतलब है कि rangepython3.x पर भी समान संपत्ति 2 है

1print xrange(30)[12] python2.x के लिए काम करता है

2 python3.x में 1 के अनुरूप कथन है print(range(30)[12])और यह काम भी करता है।


4
यह निश्चित रूप से जाने का रास्ता है, लेकिन एक nitpick: यह नहीं वास्तव में एक "डाली" है
jterrace

@ जेट्रेस ने "कास्ट" को "कन्वर्ट" में बदल दिया। आप इसके बारे में सही हैं कि यह एक कलाकार नहीं है ... मुझे वास्तव में नहीं पता कि इसे क्या कहा जाए।
mgilson

2
मैं कहूंगा कि "निर्माण" या "निर्माण" (या संभवतः "भौतिक रूप से") - जैसा कि आप "कन्वर्ट" नहीं कर रहे हैं (जैसे कि) एक सूची में एक जनरेटर, आप एक डेटा स्रोत से एक नई सूची ऑब्जेक्ट बना रहे हैं जो होता है एक जनरेटर होने के लिए ... (लेकिन सिर्फ बंटवारे बाल s'pose और नहीं 100% यकीन है कि क्या मैं वैसे भी पक्ष)
जॉन क्लेमेंट्स

2
"+1" के लिए मेरा +1 क्योंकि यह अन्य OO भाषाओं के अनुरूप है। list(arg)के एक निर्माता के रूप में बुला अन्य भाषाओं में समझा जाता है listवर्ग। दरअसल, यह पायथन केस भी है। यह बहस कि क्या वस्तु निर्माण के दौरान भरी हुई है (जैसा कि C ++ मामले में) या केवल पहली स्वचालित रूप से विधि (जैसे पायथन __init__()विधि में) के दौरान मूल सार विचार नहीं बदल सकता है। मेरा विचार है कि सूची निर्माणकर्ता पुनरावृत्ति लेता है और सूची को लौटाए गए मानों से भरता है
पीपर १४'१२

2
यह ज्यूपिटर नोटबुक में एक त्रुटि क्यों देता है और शेल में ठीक काम करता है? त्रुटि:'range' object is not callable
उप

34

Pythons <= 3.4 में, जैसा कि दूसरों ने सुझाव दिया है, list(range(10))एक सीमा से बाहर सूची बनाने के लिए उपयोग करें (सामान्य तौर पर, कोई भी चलने योग्य)।

एक अन्य विकल्प, पायथन 3.5में इसकी अनपैकेजिंग सामान्यताओं के साथ पेश किया गया है, *सूची शाब्दिक रूप से उपयोग कर रहा है []:

>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

हालांकि यह बराबर है list(r), यह शाब्दिक वाक्यविन्यास है और तथ्य यह है कि कोई फ़ंक्शन कॉल शामिल नहीं है, इसे तेज़ी से निष्पादित करने देता है। यह भी कम वर्ण है, अगर आप गोल्फ कोड की जरूरत है :-)


4
स्पष्ट होने के लिए, आप इसे अभी भी एक-पंक्ति में रख सकते हैं: [*range(10)]जब आप rangeकिसी भी उद्देश्य के लिए आवश्यक नहीं होते हैं, तो इसके लिए ठीक काम करते हैं list। साइड-नोट: मेरा पसंदीदा (ठीक है, वास्तव में नहीं) अनपैकिंग जनरल का हिस्सा यह है कि खाली setएस अब एक शाब्दिक वाक्यविन्यास है {*()}, या जैसा कि मैं इसे कहता हूं, एक-आंख वाला बंदर ऑपरेटर। ;-)
शैडो रेंजर

@ShadowRanger है कि मैं मूल रूप से इसे लिखने के बारे में कैसे सोचा था। मैंने नए पायथन उपयोगकर्ताओं को भ्रमित न करने के लिए थोड़ा और
क्रिया

26

पायथन 3.x में, range()फ़ंक्शन को अपना स्वयं का प्रकार मिला। इसलिए इस मामले में आपको पुनरावृत्ति का उपयोग करना चाहिए

list(range(1000))


11
"इस मामले में आपको पुनरावृत्ति का उपयोग करना चाहिए"? बिल्ली क्या मतलब है?
user2357112

2
मैं 3.7 python का उपयोग कर रहा हूं और x = सूची (श्रेणी (1000)) की कोशिश की है, लेकिन त्रुटि टाइप हो गई है टाइप करें: 'सूची' ऑब्जेक्ट
कॉल करने

@Earthshaker आपके पास टाइपो होना चाहिए, जैसेlist(range(1000))()
wjandrea

17

Python3 का कारण सीधे तौर पर एक सूचीबद्ध सूची प्राप्त करने के लिए एक फ़ंक्शन का अभाव है, क्योंकि मूल Python3 डिजाइनर Python2 में काफी नौसिखिया था। उन्होंने केवल range()लूप के लिए फ़ंक्शन का उपयोग माना , इस प्रकार, सूची को कभी भी विस्तारित करने की आवश्यकता नहीं होनी चाहिए। वास्तव में, बहुत बार हमें range()सूची का उत्पादन करने और फ़ंक्शन में पास होने के लिए फ़ंक्शन का उपयोग करने की आवश्यकता होती है ।

इसलिए, इस मामले में, Python3 की तुलना में Python3 कम सुविधाजनक है क्योंकि:

  • पायथन 2 में, हमारे पास है xrange()और range();
  • पायथन 3 में, हमारे पास range()और हैlist(range())

बहरहाल, आप अभी भी इस तरह से सूची विस्तार का उपयोग कर सकते हैं:

[*range(N)]

3
संपूर्ण बिंदु यह है कि इसे कम सुविधाजनक बनाने के लिए list, क्योंकि यह आमतौर पर गलत काम है। 100 में से 99 उपयोग के मामलों के लिए, एक वास्तविक बनाना listअक्षम्य और व्यर्थ है, क्योंकि rangeखुद लगभग हर तरह से एक अपरिवर्तनीय अनुक्रम की तरह काम करता है, कभी-कभी अधिक कुशलता से बूट करने के लिए (जैसे कि intएस के लिए रोकथाम परीक्षण O(1), बनाम के O(n)लिए list)। पायथन 2 में, लोग rangeडिफ़ॉल्ट रूप से उपयोग करने के लिए प्रवृत्त थे , भले ही xrangeलगभग हमेशा बेहतर विकल्प था; पायथन 3 में, आप स्पष्ट रूप से विकल्प चुन सकते हैं list, इसे गलत नाम का उपयोग करके दुर्घटना से प्राप्त न करें।
शैडो रेंजर

7
पायथन 3 डिजाइनर और पायथन 2 में उनकी विशेषज्ञता के बारे में टिप्पणी काफी बोल्ड और अभेद्य है।
kazarey

@kazarey लेकिन क्या यह सच है? अजगर में बहुत सी चीजें हैं जो इन पंक्तियों के साथ संदिग्ध हैं
javadba

1
सूची बनाने के लिए विशेष रूप से अनपैकिंग-शॉर्टहैंड के लिए अपवोट करेगा, लेकिन मैं @kazarey से सहमत हूं। डिजाइनर के बारे में टिप्पणी दोनों निराधार है (या कम से कम, संदर्भों से अप्रभावित) और अनावश्यक।
नुबर्क़

12

आपको वास्तव में किसी सूची में 1-1000 की संख्या का उपयोग करने की आवश्यकता नहीं है। लेकिन अगर किसी कारण से आपको वास्तव में इन नंबरों की आवश्यकता है, तो आप कर सकते हैं:

[i for i in range(1, 1001)]

संक्षेप में सूची की समझ:

उपरोक्त सूची समझ में आता है:

nums = []
for i in range(1, 1001):
    nums.append(i)

यह सिर्फ सूची बोध वाक्यविन्यास है, हालांकि 2.x से। मुझे पता है कि यह अजगर 3 में काम करेगा, लेकिन यह सुनिश्चित नहीं है कि क्या एक उन्नत सिंटैक्स भी है

रेंज पहले पैरामीटर को शामिल करना शुरू करती है; लेकिन दूसरे पैरामीटर को शामिल करने के लिए (जब 2 मापदंडों की आपूर्ति की जाती है; यदि पहला पैरामीटर छोड़ दिया जाता है, तो यह 0 'पर शुरू होगा)

range(start, end+1)
[start, start+1, .., end]

20
समझ क्यों? बस:list(range(1000))
रिक पोगी

धन्यवाद! क्या आप यह समझाते हैं कि मैं इसके लिए मैं क्यों हूँ ... इसके बजाय बस मैं अंदर के लिए?
०५:५० पर Boathouse

मैंने पायथन 3 के साथ काम नहीं किया है। इसलिए मैं पूरी तरह से निश्चित नहीं हूं कि यह कैसे काम करता है। मुझे पता है कि समझ में काम आएगा, लेकिन कास्टिंग पर 100% नहीं था। लेकिन अगर कास्टिंग काम करती है, तो आप सही हैं और आपका रास्ता अधिक पाइथोनिक है।
इंस्पेक्टरगेटगेट ४

1
@ inspectorG4dget: यह "कास्टिंग" नहीं है, यह list()कंस्ट्रक्टर को चलने-फिरने के साथ बुला रहा है । list()निर्माता जानता है जब किसी भी iterable वस्तु दी एक नई सूची बनाने के लिए कैसे।
ग्रेग हेविगेल

4
@ इंस्पेक्टरगैजेट: list(range(1000))python3 में काम करेगा जैसे python2 list(xrange(1000))में
रिक

4

वास्तव में, यदि आप 1-1000 (समावेशी) चाहते हैं, तो range(...)फ़ंक्शन का उपयोग मापदंडों 1 और 1001 के साथ करें: range(1, 1001)क्योंकि range(start, end)फ़ंक्शन प्रारंभ से (अंत -1), समावेशी में जाता है।


0

पायथन 3 में रेंज का उपयोग करें ।

यहां एक उदाहरण फ़ंक्शन है जो दो संख्याओं के बीच की संख्याओं के बीच लौटता है

def get_between_numbers(a, b):
    """
    This function will return in between numbers from two numbers.
    :param a:
    :param b:
    :return:
    """
    x = []
    if b < a:
        x.extend(range(b, a))
        x.append(a)
    else:
        x.extend(range(a, b))
        x.append(b)

    return x

परिणाम

print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))

[5, 6, 7, 8, 9]  
[5, 6, 7, 8, 9]

यह एक अलग सवाल का जवाब लगता है ...?
वेजेंड्रिया

-1

वास्तव में, यह पायथन 3 की तुलना में पायथन 3 का एक रेट्रो-ग्रेडेशन है। निश्चित रूप से, Python2 जो रेंज () और xrange () का उपयोग करता है, Python3 की तुलना में अधिक सुविधाजनक है, जो क्रमशः सूची (श्रेणी) (और) और रेंज () का उपयोग करता है। इसका कारण यह है कि पायथन 3 का मूल डिज़ाइनर बहुत अनुभवी नहीं है, उन्होंने केवल कई शुरुआती लोगों द्वारा रेंज फ़ंक्शन के उपयोग को बड़ी संख्या में तत्वों पर पुनरावृत्त करने के लिए माना है जहां यह मेमोरी और सीपीयू दोनों अक्षम है; लेकिन उन्होंने एक नंबर सूची बनाने के लिए रेंज फ़ंक्शन के उपयोग की उपेक्षा की। अब, उन्हें पहले से ही वापस बदलने के लिए बहुत देर हो चुकी है।

अगर मुझे पायथन 3 का डिजाइनर बनना था, तो मैं:

  1. एक क्रम पुनरावृत्त लौटने के लिए irange का उपयोग करें
  2. एक अनुक्रम सूची वापस करने के लिए व्यवस्था का उपयोग करें
  3. सीक्वेंस इटरेटर (यदि तत्वों की संख्या बड़ी है, उदाहरण के लिए, रेंज (9999999) या अनुक्रम सूची (यदि तत्वों की संख्या छोटी है, जैसे, रेंज (10)

यह इष्टतम होना चाहिए।


यह प्रश्न का उत्तर कैसे देता है?
११:१५ बजे वेजेंड्रिया

हाँ, यह Python3 डेवलपर्स को बदलने और सुधारने के लिए Python3 डेवलपर्स से अनुरोध करके प्रश्न का उत्तर देता है। लेकिन यह संभावना नहीं है कि वे बदल जाएंगे क्योंकि वे उस सुरुचिपूर्ण नहीं हैं।
xuancong84
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.