রেঞ্জ () দিয়ে বিপরীত ক্রমে একটি তালিকা মুদ্রণ করবেন?


364

range()পাইথন দিয়ে আপনি নীচের তালিকাটি কীভাবে তৈরি করতে পারেন ?

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

[* পরিসর (9, -1, -1)] সম্পর্কে কী? সুপার অজগর!
onofricamila

উত্তর:


561

reversed()ফাংশন ব্যবহার :

reversed(range(10))

এটি অনেক বেশি অর্থবহ।

হালনাগাদ:

আপনি যদি এটি একটি তালিকা হতে চান (যেমন বিটিকে নির্দেশিত):

list(reversed(range(10)))

হালনাগাদ:

আপনি যদি rangeএকই ফলাফল অর্জন করতে ব্যবহার করতে চান তবে আপনি এর সমস্ত পরামিতি ব্যবহার করতে পারেন।range(start, stop, step)

উদাহরণস্বরূপ, একটি তালিকা তৈরি [5,4,3,2,1,0]করতে, আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

range(5, -1, -1)

এটি কম স্বজ্ঞাত হতে পারে তবে মন্তব্যগুলির হিসাবে উল্লেখ করা হয়েছে যে, এটি আরও দক্ষ এবং বিপরীত তালিকার জন্য পরিসরের সঠিক ব্যবহার।


13
যদিও এটি 'কম' দক্ষ। এবং আপনি এটি উপর কাটা অপারেশন করতে পারবেন না।
জাকব বোয়ায়ার

6
এই উত্তরটি খুব স্পষ্ট এবং বোঝা সহজ, তবে এটি হওয়া দরকার range(10), না range(9)। এছাড়াও, আপনি যদি একটি সম্পূর্ণরূপে গঠিত তালিকা চান (টুকরো টুকরো টুকরো করার জন্য), আপনার করা উচিত list(reversed(range(10)))
জন ওয়াই

5
এটি একটি পুনরুক্তি উত্পাদন করে, ওপি একটি তালিকা আকারে ফলাফল জিজ্ঞাসা করে।
বিটিকে

6
পাইথন জেনারেটরের সাথে "বিপরীত" ব্যবহার করা (ধরে নেওয়া যাক আমরা পাইথন 3 রেঞ্জটি অন্তর্নির্মিত সম্পর্কে কথা বলি) কেবল ধারণাগতভাবেই ভুল এবং উচ্চ স্তরের ভাষায় প্রোগ্রাম করার সময় স্মৃতি / প্রসেসিং জটিলতা বিবেচনা না করার ভুল অভ্যাসটি শেখায়।
thedk

7
পাইথন 3 এ, reversedসাধারণভাবে জেনারেটর গ্রহণ করে না তবে তা গ্রহণ করে range। কেন reversed(range(10000))পুরো তালিকাটির জন্য মেমরি বরাদ্দ করা দরকার? rangeএমন কোনও বস্তু ফিরে আসতে পারে __reversed__যা কার্যকর বিপরীত পুনরাবৃত্তির অনুমতি দেয় এমন পদ্ধতি প্রয়োগ করে ?
অ্যাভোমেন

312

অন্তর্নির্মিত ফাংশনটি 'ব্যাপ্তি' ব্যবহার করুন। স্বাক্ষরটি হ'ল range(start, stop, step)। এটি এমন একটি ক্রম তৈরি করে যা সংখ্যার ফল দেয়, শুরু করে startএবং শেষ হয়েছে কিনা stop, বাদ দিয়ে stop

>>> range(9,-1,-1)   
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> range(-2, 6, 2)
    [-2, 0, 2, 4]

পাইথন 3-তে, এটি একটি তালিকাবিহীন rangeঅবজেক্ট তৈরি করে, যা কেবলমাত্র পঠনযোগ্য তালিকার মতো কার্যকরভাবে কার্যকর হয় (তবে বিশেষত বৃহত্তর ব্যাপ্তির জন্য কম মেমরি ব্যবহার করে)।


1
আপনি দয়া করে এটিও ব্যাখ্যা করতে পারেন, আপনি দয়া করে আমাকে পাইথনের জন্য কোনও ওয়েবসাইট / পিডিএফ বইয়ের সুপারিশ করতে পারেন
ramesh.mimit

8
@ রামেশ আপনি যদি help(range)অজগর শেলটি চালান তবে এটি আপনাকে আর্গুমেন্টগুলি বলবে। এগুলি শুরু করার সংখ্যা, শেষ হওয়া সংখ্যা (একচেটিয়া) এবং কী পদক্ষেপ নিতে হবে, তাই এটি 9 থেকে শুরু হয় এবং 1-বিয়োগ করা অবধি 1-এ পৌঁছায় which পরিসীমা 0 এ শেষ হয়
মাইকেল মরোজেক

3
@ ramesh.mimit: কেবল সরকারী পাইথন সাইটে যান। একটি দুর্দান্ত টিউটোরিয়াল সহ পুরো ডকুমেন্টেশন রয়েছে।
জন ওয়াই

5
সত্যই, এটি সঠিক উত্তর, তবে এটি আরও পরিষ্কারভাবে ব্যাখ্যা করা যেতে পারে। range(start, stop, step) - সংখ্যাটি থেকে শুরু করুন startএবং প্রতিবারের সাথে stopসরানো না হওয়া পর্যন্ত ফলন ফলাফল step
মিঃ বি

43

আপনি range(10)[::-1]যা একই জিনিস range(9, -1, -1)এবং তর্কযোগ্যভাবে আরও পঠনযোগ্য (আপনি যদি সাধারণ sequence[::-1]পাইথন আইডিয়মের সাথে পরিচিত হন ) ব্যবহার করতে পারেন।


28

যারা এখন পর্যন্ত সংগ্রহ করা বিকল্পগুলির "দক্ষতা" সম্পর্কে আগ্রহী তাদের জন্য ...

জেইমি RGP এর উত্তর আমার কাছে নেতৃত্বে আমার কম্পিউটার পুনরায় আরম্ভ করুন পর সময়জ্ঞান এর কিছুটা "চ্যালেঞ্জ" সমাধান জেসন আক্ষরিক আমার নিজের প্রস্তাবনা (মন্তব্য এর মাধ্যমে) করে। আপনার ডাউনটাইমটি সম্পর্কে কৌতূহলকে বাঁচানোর জন্য, আমি এখানে আমার ফলাফলগুলি উপস্থিত করছি (সবচেয়ে খারাপ):

জেসনের উত্তর ( তালিকার বোঝার শক্তিটিতে কেবলমাত্র একটি ভ্রমণ )

$ python -m timeit "[9-i for i in range(10)]"
1000000 loops, best of 3: 1.54 usec per loop

মার্টিনোর উত্তর (আপনি যদি প্রসারিত টুকরো সিনট্যাক্সের সাথে পরিচিত হন তবে পাঠযোগ্য ):

$ python -m timeit "range(10)[::-1]"
1000000 loops, best of 3: 0.743 usec per loop

মিশা-আরাজারের উত্তর (গ্রহণযোগ্য, খুব পাঠযোগ্য):

$ python -m timeit "reversed(range(10))"
1000000 loops, best of 3: 0.538 usec per loop

বেনার এর উত্তর (খুব প্রথম, তবে সেই সময়ে খুব চিত্তাকর্ষক ):

$ python -m timeit "range(9,-1,-1)"
1000000 loops, best of 3: 0.401 usec per loop

শেষ বিকল্পটি ভাল নেকম্যানেরrange(n-1,-1,-1) দ্বারা স্বরলিপিটি ব্যবহার করে মনে রাখা সহজ ।


3
এই উত্তরটি পড়ার আগে আমি নিজের সময় নিজেই করেছি এবং একই ফলাফল পেয়েছি।
টড ওভেন

13
for i in range(8, 0, -1)

এই সমস্যা সমাধান করবে। এটি 8 থেকে 1 আউটপুট আসবে এবং -1 এর অর্থ একটি বিপরীত তালিকা


10

ব্যবহারের কোনও বুদ্ধি নেই reverseকারণ পরিসীমা পদ্ধতি বিপরীত তালিকায় ফিরে আসতে পারে।

আপনার যখন এন আইটেমগুলির মাধ্যমে পুনরাবৃত্তি হয় এবং range(start, stop, step)আপনি ফিরে আসা তালিকার ক্রমটি প্রতিস্থাপন করতে চান তখন আপনাকে তৃতীয় প্যারামিটারের ব্যাপ্তি ব্যবহার করতে হবে যা সনাক্ত করে stepএবং এটিতে সেট করে -1, অন্য প্যারামিটারগুলি সেই অনুযায়ী সামঞ্জস্য করা হবে:

  1. প্রদান করুন স্টপ হিসাবে পরামিতি -1(এটা পূর্ববর্তী মান stop - 1, stopসমান ছিল 0)।
  2. প্যারামিটার ব্যবহার শুরু হিসাবে n-1

বিপরীতে ক্রমের (এন) এর সমতুল্য হ'ল:

n = 10
print range(n-1,-1,-1) 
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

6
সত্যি বলতে আমি এর চেয়ে কম স্বজ্ঞাত মনে করিreversed(range(n))
নিকোলাস হ্যামিল্টন

1
@ নিকোলাসহ্যামিলটন আপনার সাথে একমত, তবে এর উত্তরের পিছনে ধারণা কম সংস্থান ব্যবহার করা ... (এবং প্রশ্নটি ছিল মাত্র পরিসীমা ফাংশন ব্যবহার করার বিষয়ে :))
অ্যান্ড্রি ইভানিয়েকো

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

8

পাঠযোগ্যতা একপাশে, reversed(range(n))মনে হয় এর চেয়ে দ্রুত range(n)[::-1]

$ python -m timeit "reversed(range(1000000000))"
1000000 loops, best of 3: 0.598 usec per loop
$ python -m timeit "range(1000000000)[::-1]"
1000000 loops, best of 3: 0.945 usec per loop

কেউ যদি ভাবছিলেন :)


কিছু সংখ্যা থাকা ভাল :) - আপনি range(1000000000-1,-1,-1)পাশাপাশি যুক্ত করলেন না কেন ?
উলফ

... আরও ভাল timeit range(1000000000-1,-1,-1)কমান্ড লাইনে চেষ্টা করবেন না , পরিবর্তে আমার ফলাফল দেখুন :-)
ওল্ফ

6

এই প্রশ্নের প্রয়োজনীয়তার জন্য listউত্থানের ক্রমের দশ আকারের পূর্ণসংখ্যার জন্য কল করা হবে । সুতরাং, আসুন অজগর একটি তালিকা তৈরি করুন।

# This meets the requirement.
# But it is a bit harder to wrap one's head around this. right?
>>> range(10-1, -1, -1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

# let's find something that is a bit more self-explanatory. Sounds good?
# ----------------------------------------------------

# This returns a list in ascending order.
# Opposite of what the requirement called for.
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# This returns an iterator in descending order.
# Doesn't meet the requirement as it is not a list.
>>> reversed(range(10))
<listreverseiterator object at 0x10e14e090>

# This returns a list in descending order and meets the requirement
>>> list(reversed(range(10)))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

2
আমি ট্রিপলটি-1 সত্যই পছন্দ করি এটি ঠিক এই প্যাটার্নটি এটি রাখা সহজ করে তোলে wrap one's head around this- আজ আমি শিখেছি যে যদি এটি সত্যিই দক্ষ হতেrange(n-1, -1, -1) হয় তবে বিপরীত ক্রমে কোনও সীমাটি অনুসরণ করার সময় ব্যবহার করুন ।
ওল্ফ

5

রেফারেন্স () বিআইএফ এর মত বিপরীত সংখ্যার মুদ্রণ আপনি করতে পারেন,

for number in range ( 10 , 0 , -1 ) :
    print ( number ) 

আউটপুট হবে [10,9,8,7,6,5,4,3,2,1]

পরিসর () - পরিসীমা (শুরু, শেষ, বৃদ্ধি / হ্রাস) যেখানে শুরুটি অন্তর্ভুক্ত থাকে, শেষটি একচেটিয়া এবং বর্ধন যে কোনও সংখ্যা হতে পারে এবং পদক্ষেপের মতো আচরণ করে


5

খুব প্রায়ই জিজ্ঞাসা করা প্রশ্ন পাইথন 3 এর range(9, -1, -1)চেয়ে ভাল কিনা reversed(range(10))? যেসব লোক পুনরুক্তিকারীদের সাথে অন্যান্য ভাষায় কাজ করেছেন তাদের তাত্ক্ষণিকভাবে মনে হয় যে বিপরীত () অবশ্যই সমস্ত মান ক্যাশে করবে এবং তারপরে বিপরীত ক্রমে ফিরে আসবে। কথাটি হ'ল পাইথনের reversed()অপারেটরটি যদি কাজটি করে না তবে যদি বস্তুটি কেবল একটি পুনরাবৃত্ত হয়। বিপরীত () কাজ করার জন্য অবজেক্টটির নীচের দু'এর একটি থাকতে হবে:

  1. হয় সমর্থন len()এবং পূর্ণসংখ্যার সূচক মাধ্যমে[]
  2. অথবা __reversed__()পদ্ধতি প্রয়োগ করা হয়েছে।

যদি আপনি ওপরের কোনওটিই নেই এমন বস্তুটিতে বিপরীত () ব্যবহার করার চেষ্টা করেন তবে আপনি পাবেন:

>>> [reversed((x for x in range(10)))]
TypeError: 'generator' object is not reversible

সুতরাং সংক্ষেপে, পাইথন reversed()কেবলমাত্র বস্তুর মতো অ্যারেতে বোঝানো হয় এবং তাই এতে ফরোয়ার্ড পুনরাবৃত্তির মতোই পারফরম্যান্স হওয়া উচিত।

তবে কি range()? এটা কি জেনারেটর নয়? পাইথন 3 এ এটি জেনারেটর তবে একটি শ্রেণিতে আবৃত যা উপরের উভয়টিকেই কার্যকর করে। সুতরাংrange(100000) প্রচুর স্মৃতি গ্রহণ করে না তবে এটি এখনও দক্ষ ইনডেক্সিং এবং বিপরীতকে সমর্থন করে।

সুতরাং সংক্ষেপে, আপনি reversed(range(10))পারফরম্যান্সের কোনও হিট ছাড়াই ব্যবহার করতে পারেন ।


3

আমি বিশ্বাস করি এটি সাহায্য করতে পারে,

range(5)[::-1]

নীচে ব্যবহার:

for i in range(5)[::-1]:
    print i 

3
range(9,-1,-1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

13
আপনার উত্তরটি দেখায় কেন reversed(range(10))ত্রুটি-প্রবণতা কম। কোনও অপরাধ অ্যাসিনাক্স নয়। শুধু একটি সৎ পর্যবেক্ষণ।
মিশা łরাজের

ডিসপ্লেতে ভ্রান্ত উত্তরগুলি রেখে দেওয়া মানদণ্ড কিনা তা আমি জানি না। আমি বা কেউ এটিকে সংশোধন করতে বা এমনকি এটি সরাতে পারি?
সিনেকোনটা

3
@ সাইন, না, কেবল এটিকে ছেড়ে যান এবং অবাক হন যে কীভাবে এটি 3 টি উপস্থাপনা জমেছে ... আমি মনে করি আপনি এটি নিয়ন্ত্রণকারীর মনোযোগের জন্য পতাকাঙ্কিত করতে পারেন ( ভাঙ্গা বাদে 18 মাস আগে উত্তরের নকল ), তারা এটিকে মুছে ফেলবে কিনা তা নিশ্চিত নয় not
ওজিহাজা

ভবিষ্যতের সমস্ত রেফারেন্সের জন্য: কোডটি কেবল ভিএলকিউ নয় , এবং ভুল উত্তরও পতাকাঙ্কিত হওয়ার কথা নয় । ডাউনভোট করুন এবং এগিয়ে যান, তবে এনএএ বা মোড-ফ্ল্যাগিং হ'ল পতাকা এই ক্ষেত্রে ভুল। - পর্যালোচনা থেকে
জো

2

[:: - 1] ছাড়াই বা বিপরীত ব্যবহার করে -

def reverse(text):
    result = []
    for index in range(len(text)-1,-1,-1):
        c = text[index]
        result.append(c)
    return ''.join(result)

print reverse("python!")

6
কেন কেউ এর পরিবর্তে এটি লিখতে হবে "python!"[::-1]?
ড্যানিয়েল


1

আপনার অবিচ্ছিন্নভাবে পরিসীমা ফাংশনটি ব্যবহার করার দরকার নেই, আপনি কেবল তালিকা [:: - 1] করতে পারেন যা কোনও সংযোজন না করে বিপরীত ক্রমে তালিকাটি দ্রুত ফিরিয়ে আনবে।


এটি পূর্ববর্তী উত্তরে প্রস্তাবিত সমাধান হিসাবে উপস্থিত বলে মনে হচ্ছে । এটি সম্ভবত প্রদর্শিত হয় যে আপনি অন্য কোনও পূর্ববর্তী উত্তর সম্পর্কে মন্তব্য করার চেষ্টা করছেন - এটি করার আগে আপনাকে কিছুটা খ্যাতি অর্জন করতে হবে।
গ্রিশা লেবিট

1

ধরুন আপনার একটি লিস্ট আছে এটি কল করুন = = = 1,2,3,4,5} এখন আপনি যদি তালিকাটি বিপরীতে মুদ্রণ করতে চান তবে কেবল নীচের কোডটি ব্যবহার করুন।

a.reverse
for i in a:
   print(i)

আমি জানি আপনি পরিসীমা ব্যবহার করতে বলেছিলেন তবে এর উত্তর ইতিমধ্যে দেওয়া আছে।


0
range(9,-1,-1)
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

সঠিক ফর্ম হয়। আপনি যদি ব্যবহার

reversed(range(10))

আপনি একটি 0 কেস পাবেন না। উদাহরণস্বরূপ, বলুন যে আপনার 10 টি কোনও যাদু নম্বর নয় এবং আপনি পরিবর্তনটি বিপরীত থেকে শুরু করার জন্য ব্যবহার করছেন vari যদি আপনার এন কেস 0 হয় তবে বিপরীত (পরিসর (0)) কার্যকর করবে না যা ভুল বলে যদি আপনার সুযোগে শূন্য সূচকে কোনও একক বস্তু থাকে।


0

আমি ভেবেছিলাম যে অনেকগুলি (নিজেকে হিসাবে) পরিবর্তিত ক্রমে বিদ্যমান তালিকার পরিবর্তে সাধারণ ক্ষেত্রে বেশি আগ্রহী হতে পারে , যেমন শিরোনামে বলা হয়েছে, কেবল এই জাতীয় ট্র্যাভারসালের জন্য সূচক তৈরি করার পরিবর্তে।

যদিও, সমস্ত ক্ষেত্রে সঠিক উত্তর এখনও এই ক্ষেত্রে পুরোপুরি ঠিক আছে, আমি উল্লেখ করতে চাই যে ওল্ফের উত্তরে সম্পাদিত পারফরম্যান্স তুলনাটি কেবল সূচক উত্পন্ন করার জন্য। সুতরাং আমি বিপরীত ক্রমে বিদ্যমান তালিকাটি অতিক্রমের জন্য একই জাতীয় মানদণ্ড তৈরি করেছি।

টিএল; ডিআর a[::-1] দ্রুততম।

পূর্বশর্ত:

a = list(range(10))

জেসনের উত্তর :

%timeit [a[9-i] for i in range(10)]
1.27 µs ± 61.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

মার্টিনোর উত্তর :

%timeit a[::-1]
135 ns ± 4.07 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

মিশা-এরজারের উত্তর :

%timeit list(reversed(a))
374 ns ± 9.87 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

উত্তরের উত্তর :

%timeit [a[i] for i in range(9, -1, -1)]
1.09 µs ± 11.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

যেমন আপনি দেখতে পাচ্ছেন, এক্ষেত্রে সুস্পষ্টভাবে সূচকগুলি তৈরি করার দরকার নেই, তাই দ্রুততম পদ্ধতিটি হ'ল অতিরিক্ত অতিরিক্ত ক্রিয়া করে।

এনবি: আমি জপিটারল্যাবে পরীক্ষা করেছি যার হাতে "ম্যাজিক কমান্ড" রয়েছে %timeit। এটি timeit.timeitহুডের নীচে মান ব্যবহার করে। পাইথন ৩.7.৩ এর জন্য পরীক্ষিত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.