পাইথন 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))

পাইথন 2.x-তে জেনারেটরগুলির সাথে আপনি এটি কীভাবে করেন। সাধারণত বলতে গেলে আপনার সম্ভবত কোনও তালিকার দরকার নেই যদিও আপনি my_list[i]আরও দক্ষতার সাথে ( i + 1) মূল্য নিয়ে আসতে পারেন এবং যদি আপনাকে কেবল এটির পুনরাবৃত্তি করতে হয় তবে আপনি কেবল পিছিয়ে যেতে পারেন range

এছাড়াও খেয়াল করুন যে পাইথন 2.x xrangeএ এখনও ইনডেক্সযোগ্য 1 । এর অর্থ rangeপাইথন 3.x এও একই সম্পত্তি 2 রয়েছে

print xrange(30)[12]পাইথন 2.x এর জন্য 1 কাজ করে

2 অনুরূপ বিবৃতি 1 python3.x হয় print(range(30)[12])এবং যে এছাড়াও কাজ করে।


4
এটি অবশ্যই যাওয়ার উপায়, তবে একটি নিটপিক: এটি সত্যই "কাস্ট" নয়
জেটেরাস

@ জেটেরেস "কাস্ট" কে "রূপান্তর" করতে পরিবর্তন করেছেন। আপনি এটি কাস্ট না হয়ে ঠিক বলেছেন ... সত্যিকার অর্থে কী বলা উচিত তা আমি জানি না।
মিগিলসন

2
আমি "কন্সট্রাক্ট" বা "বিল্ড" (বা সম্ভবত "অবৈতনিক") বলব - যেহেতু আপনি কোনও জেনারেটরকে কোনও তালিকায় "রূপান্তর" করছেন না, আপনি ডেটা উত্স থেকে একটি নতুন তালিকা অবজেক্ট তৈরি করছেন যা ঘটে জেনারেটর হওয়ার জন্য ... (তবে কেবল চুলের বিভাজনগুলি বলুন এবং আমি যাই হোক না কেন তার পক্ষে 100% নিশ্চিত নয়)
জন ক্লিমেটস

2
আমার +1 "নির্মাণের" জন্য যেমন এটি অন্যান্য ওও ভাষার সাথে সামঞ্জস্যপূর্ণ। list(arg)একটি কন্সট্রাকটর আহ্বানের মত গণ্য করো অন্যান্য ভাষায় বোঝা যায় listবর্গ। আসলে এটি পাইথন কেসও। নির্মাণের সময় (সি ++ ক্ষেত্রে হিসাবে) বা কেবল প্রথম স্বয়ংক্রিয়ভাবে বলা পদ্ধতি (পাইথন __init__()পদ্ধতির মতো) এর মধ্যে অবজেক্টটি পূরণ হয়েছে কিনা তা নিয়ে বিতর্কগুলি মৌলিক বিমূর্ত ধারণাটি পরিবর্তন করতে পারে না। আমার দৃষ্টিভঙ্গি হ'ল তালিকার কনস্ট্রাক্টর পুনরুদ্ধারকারীটি নেয় এবং প্রত্যাবর্তিত মানগুলি দিয়ে তালিকাটি পূরণ করে
পিআরপি

2
কেন এটি জুপিটার নোটবুক এবং শেল ভাল কাজ করে একটি ত্রুটি দেয়? ত্রুটি:'range' object is not callable
সূক্ষ্ম সন্ধানকারী

34

পাইথনস <= 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এখন একটি আক্ষরিক বাক্য গঠন রয়েছে {*()}, বা আমি যেমন এটি বলি, একাকী বানর অপারেটর। ;-)
শ্যাডোর্যাঞ্জার

@ শ্যাডোএ্যাঞ্জার এটি লেখার বিষয়ে আমি মূলত ভেবেছিলাম। নতুন পাইথন ব্যবহারকারীদের বিভ্রান্ত না করার জন্য আমি কিছুটা আরও
ভার্জোজ

26

পাইথন ৩.x এ, range()ফাংশনটি নিজস্ব ধরণের পেয়েছে। সুতরাং এক্ষেত্রে আপনাকে অবশ্যই পুনরাবৃত্তকারী ব্যবহার করতে হবে

list(range(1000))


11
"এই ক্ষেত্রে আপনার অবশ্যই পুনরুক্তি ব্যবহার করতে হবে"? হেক মানে এর মানে কি?
ব্যবহারকারী 2357112

2
আমি পাইথন ৩.7 ব্যবহার করেছি এবং এক্স = তালিকা (রেঞ্জ (1000)) চেষ্টা করেছি কিন্তু ত্রুটি পেয়েছি টাইপ এয়ারার: ​​'তালিকা' অবজেক্টটি কল করার
যোগ্য

@ আর্থশেকার আপনার অবশ্যই একটি টাইপো থাকতে হবে, যেমনlist(range(1000))()
ওজান্দ্রিয়া

17

পাইথন 3 সরাসরি রেঞ্জযুক্ত তালিকার জন্য কোনও কার্যকারিতা না থাকার কারণটি মূল পাইথন 3 ডিজাইনার পাইথন 2-তে বেশ নবাগত ছিলেন। তিনি কেবলমাত্র range()একটি লুপের জন্য ফাংশনটির ব্যবহার বিবেচনা করেছিলেন , সুতরাং, তালিকাটি কখনই প্রসারিত করার প্রয়োজন হবে না। আসলে, প্রায়শই আমাদের range()একটি তালিকা তৈরি করতে এবং একটি ফাংশনে প্রবেশের জন্য ফাংশনটি ব্যবহার করতে হবে ।

সুতরাং, এক্ষেত্রে পাইথন 3 পাইথন 2 এর তুলনায় কম সুবিধাজনক কারণ:

  • পাইথন 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 তে তার দক্ষতা সম্পর্কে মন্তব্যটি যথেষ্ট সাহসী এবং অনর্থক।
কাজারে

@ কাজারে কিন্তু এটা কি সত্য?
অজগরটিতে অনেকগুলি বিষয়

1
তালিকাটি তৈরি করতে বিশেষত আনপ্যাকিং-শর্টহ্যান্ডের পক্ষে উত্সাহ দেওয়া হবে, তবে আমি @ কাজারির সাথে একমত। ডিজাইনার সম্পর্কে মন্তব্য উভয় ভিত্তিহীন (বা কমপক্ষে, রেফারেন্স দ্বারা ব্যতীত) এবং অপ্রয়োজনীয়।
নুবার্কে

12

আপনার তালিকার 1-1000 নম্বরগুলি ব্যবহার করার দরকার নেই। তবে যদি কোনও কারণে আপনার এই সংখ্যাগুলির সত্যিই প্রয়োজন হয় তবে আপনি এটি করতে পারেন:

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

সংক্ষেপে সংক্ষিপ্তসার তালিকা:

উপরের তালিকা অনুধাবন অনুবাদ করে:

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

এটি কেবলমাত্র তালিকা বোধগোলনের বাক্য গঠন, যদিও ২.x থেকে। আমি জানি যে এটি অজগর 3 এ কাজ করবে তবে এটি নিশ্চিত নয় যে সেখানে একটি আপগ্রেড সিনট্যাক্সও রয়েছে কিনা

প্রথম পরামিতি সহ ব্যাপ্তি শুরু হয়; তবে শেষ হয় দ্বিতীয় প্যারামিটারটি অন্তর্ভুক্ত না করে (যখন 2 পরামিতি সরবরাহ করা হয়; প্রথম প্যারামিটারটি যদি ছেড়ে যায় তবে এটি '0' এ শুরু হবে)

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

20
বোধগম্যতা কেন? ঠিক:list(range(1000))
রিক পোগি

ধন্যবাদ! আপনি কেবল ইন-এর পরিবর্তে আমি কেন ভিতরে আছি তা বোঝাতে কি আপত্তি হবে?
বোথহাউস

আমি পাইথন 3 নিয়ে কাজ করি নি। সুতরাং এটি কীভাবে কাজ করে সে সম্পর্কে আমি পুরোপুরি নিশ্চিত নই। আমি জানি বোধগম্য কাজ করবে তবে কাস্টিংয়ের ক্ষেত্রে 100% ছিল না। তবে castালাই যদি কাজ করে তবে আপনি সঠিক এবং আপনার উপায়টি অজগর।
ইন্সপেক্টর

1
@ ইন্সপেক্টর জি ৪ডেজেট: এটি " list()ingালাই " নয়, এটি নির্মাণকারীকে পুনরাবৃত্তিযোগ্য সাথে ডেকে আনেlist()কন্সট্রাকটর জানেনা কবে কোন iterable বস্তুর দেওয়া একটি নতুন তালিকা তৈরি করার পদ্ধতি।
গ্রেগ হিউগিল

4
@ inspectorG4dget: list(range(1000))ঠিক python3 কাজ করবে list(xrange(1000))python2 মধ্যে
রিক Poggi

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]

এটি অন্য একটি প্রশ্নের উত্তর দিবে বলে মনে হচ্ছে ...?
wjandrea

-1

আসলে, পাইথন 2 এর তুলনায় এটি পাইথন 3 এর একটি রেট্রো গ্রেডেশন। অবশ্যই, পাইথন 2 যা রেঞ্জ () এবং এক্সরেঞ্জ () ব্যবহার করে পাইথন 3 এর চেয়ে বেশি সুবিধাজনক যা যথাক্রমে তালিকা (রেঞ্জ ()) এবং ব্যাপ্তি () ব্যবহার করে। কারণটি কারণ পাইথন 3 এর মূল ডিজাইনার খুব অভিজ্ঞ নয়, তারা কেবল প্রচুর শুরুর দ্বারা পরিসীমা ফাংশনটি বিপুল সংখ্যক উপাদানগুলিতে পুনরাবৃত্তি করতে বিবেচনা করেছিলেন যেখানে এটি মেমরি এবং সিপিইউ উভয়ই অক্ষম; তবে তারা একটি সংখ্যা তালিকা তৈরি করতে ব্যাপ্তি ফাংশনটির ব্যবহার অবহেলা করেছে। এখন, তাদের ইতিমধ্যে ফিরে আসতে দেরি হয়ে গেছে।

যদি আমি পাইথন 3 এর ডিজাইনার হয়ে থাকি, তবে আমি করব:

  1. একটি সিকোয়েন্স পুনরাবৃত্তির ফিরিয়ে দিতে ইরঞ্জ ব্যবহার করুন
  2. ক্রম তালিকাটি ফিরে আসতে ল্যাঞ্জ ব্যবহার করুন
  3. হয় সিক্যুয়েন্স পুনরাবৃত্তকারী (যদি উপাদানের সংখ্যা বড় হয়, উদাহরণস্বরূপ, পরিসর (9999999) বা অনুক্রমের তালিকা (যদি উপাদানগুলির সংখ্যা ছোট হয়, যেমন, পরিসর (10))

এটি সর্বোত্তম হওয়া উচিত।


কিভাবে এই প্রশ্নের উত্তর দেয়?
wjandrea

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