1 থেকে শুরু করে কতগুলি সংখ্যার সীমা গণনা করা যায়


154

আমি পাইথন 2.5 ব্যবহার করছি, আমি এর মতো একটি গণনা চাই (0 এর পরিবর্তে 1 থেকে শুরু করে):

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

আমি পাইথন ২. in এ জানি আপনি করতে পারেন: h = গণনা করুন (পরিসর (2000, 2005), 1) উপরের ফলাফলটি দিতে কিন্তু পাইথন 2.5 এ আপনি পারবেন না ...

পাইথন 2.5 ব্যবহার করে:

>>> h = enumerate(range(2000, 2005))
>>> [x for x in h]
[(0, 2000), (1, 2001), (2, 2002), (3, 2003), (4, 2004)]

অজগর 2.5 তে এই কাঙ্ক্ষিত ফলাফলটি পাওয়ার জন্য কি কেউ কোনও উপায় জানেন?

ধন্যবাদ,

জেফ


4
কেবল কৌতুহলী, আমি এমন একজন যিনি পাইথনের পথে পেশাদারভাবে বেশি কিছু করেন নি। আপনার সংস্থাটি সামঞ্জস্যতার কারণে আপগ্রেড করতে চায় না বলে আপনি কি পাইথন 2.5 তে সীমাবদ্ধ?
শান

2
সমস্ত 2.x সংস্করণ পিছনের দিকে সামঞ্জস্যপূর্ণ, সুতরাং এটি কোনও কারণ নয়।
জোচেন রিটজেল

কিছু মডিউলগুলিতে এটি বলুন - এখানে কয়েকটি রয়েছে যা পাই 2.5 এ কাজ করে তবে পাই 2.6 নয়
xorsyst

উত্তর:


179

আপনি ইতিমধ্যে উল্লিখিত হিসাবে, পাইথন 2.6 বা আরও নতুন ক্ষেত্রে এটি করা সহজবোধ্য:

enumerate(range(2000, 2005), 1)

পাইথন 2.5 এবং তার চেয়ে বেশি বয়স্ক startপ্যারামিটারটিকে সমর্থন করে না তার পরিবর্তে আপনি দুটি বিস্তৃত বস্তু তৈরি করতে এবং সেগুলিকে জিপ করতে পারেন:

r = xrange(2000, 2005)
r2 = xrange(1, len(r) + 1)
h = zip(r2, r)
print h

ফলাফল:

[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

আপনি যদি তালিকার পরিবর্তে জেনারেটর তৈরি করতে চান তবে আপনি তার পরিবর্তে izip ব্যবহার করতে পারেন ।


ব্যবহার করে izipএবং xrangeগণনার নিকটবর্তী হবেন
জন লা রুই

7
এই উত্তরটি পুরানো, এখন আপনি enumerate(iterable, start=1)পাইথন ২.6 এর মতোই রাখতে পারেন ।
ফ্রেড্রিক ব্রেনান

@ ফ্রব: আপনি প্রশ্নটি পড়েছেন? পাইথন ২.on এর সমাধান তিনি ইতিমধ্যে জানেন। তিনি বিশেষত পাইথন 2.5 তে কাজ করে এমন একটি সমাধান চেয়েছিলেন।
মার্ক বাইয়ার্স

1
@ মার্কবায়ার্স স্পষ্টতই আমি অন্ধ :) এর জন্য সত্যিই দুঃখিত। ("1 থেকে শুরু করে গণনা করুন" এর জন্য গুগলে এটি # 1)
ফ্রেড্রিক ব্রেনান

2
@ ৮ ইঞ্চি হ্যাঁ, আমি সবেমাত্র গুগল অনুসন্ধান থেকে এখানে এসেছি "শূন্য অজগর থেকে গণনা শুরু করা যায় না" :)
বেক্সএক্স

166

এটি কেবল উত্তরসূরির জন্য এখানে রাখার জন্য, ২.6-তে "শুরু" প্যারামিটারটি এভাবে গণনা করার জন্য যুক্ত করা হয়েছিল:

enumerate(sequence, start=1)


26
নোট করুন যে এটি তালিকার প্রথম আইটেমটি এড়িয়ে যায় না, এটি সূচনাটি সূচনা মান দিয়ে অফসেট করে, সুতরাং আপনি যদি কিছু sequence[i]করেন তবে আপনার কোডের মধ্যে সীমা ছাড়িয়ে একটি অ্যারে পাবেন ।
ফায়াত

14

সহজ, কেবল আপনার নিজের ক্রিয়াকলাপটিকে সংজ্ঞায়িত করুন যা আপনি যা চান তা করে:

def enum(seq, start=0):
    for i, x in enumerate(seq):
        yield i+start, x

12

পাইথন ঘ

অফিসিয়াল ডকুমেন্টেশন: enumerate(iterable, start=0)

সুতরাং আপনি এটি এর মতো ব্যবহার করবেন:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']

>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

10

পাইথন 2.5 তে করার সহজ উপায় আপনি যা জিজ্ঞাসা করেছেন ঠিক তা:

import itertools as it

... it.izip(it.count(1), xrange(2000, 2005)) ...

আপনি যদি একটি তালিকা চান তবে আপনার উপস্থিতির zipপরিবর্তে এটি ব্যবহার করুন it.izip

(বিটিডাব্লু, একটি সাধারণ নিয়ম হিসাবে, জেনারেটর বা অন্য কোনও পুনরাবৃত্ত এক্স এর বাইরে তালিকা তৈরি করার সর্বোত্তম উপায়টি নয় [x for x in X] , বরং list(X))।


6
from itertools import count, izip

def enumerate(L, n=0):
    return izip( count(n), L)

# if 2.5 has no count
def count(n=0):
    while True:
        yield n
        n+=1

এখন h = list(enumerate(xrange(2000, 2005), 1))কাজ করে।


6

গণনা তুচ্ছ, এবং তাই এটি একটি পুনরায় বাস্তবায়নের জন্য একটি গ্রহণ গ্রহণ করতে:

def enumerate(iterable, start = 0):
    n = start
    for i in iterable:
        yield n, i
        n += 1

নোট করুন যে এটি সূচনা যুক্তি ছাড়াই গণনা ব্যবহার করে কোড ভাঙবে না। বিকল্পভাবে, এই অনলাইনারটি আরও মার্জিত এবং সম্ভবত দ্রুততর হতে পারে, তবে গণনার অন্যান্য ব্যবহারগুলিও ভেঙে দেয়:

enumerate = ((index+1, item) for index, item)

দ্বিতীয়টি ছিল খাঁটি বাজে কথা। @ ডানকান র্যাপারটি ঠিকই পেয়েছেন।


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

5
>>> list(enumerate(range(1999, 2005)))[1:]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

গণনার একটি জেনারেটর হওয়া উচিত। প্রায়শই গ্রহণযোগ্য না হলে কেবল পুনরাবৃত্তি করতে একবারে একটি সম্পূর্ণ তালিকা তৈরি করা
জন লা রুই

জেনারালাইজড: শুরু = 4 তালিকা (গণনা করা (পরিসীমা (শুরু) + রেঞ্জ (1999, 2005))) [শুরু:]
টনি ভিজাইলাইন


3

h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]


1
তিনি পাইথন 2.5 তে এটি করতে পারবেন না। শুরুর প্যারামিটার পাইথন 2.6 চালু হয়: docs.python.org/library/functions.html#enumerate । প্রশ্নেও এর উল্লেখ করেছেন তিনি।
মার্ক বাইয়ার্স

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

++: এটি করার উপায় এটি
নাস বনভ

2

ঠিক আছে, আমি এখানে কিছুটা বোকা বোধ করছি ... এরকম কিছু দিয়ে না করার কারণ কী
[(a+1,b) for (a,b) in enumerate(r)]? আপনি যদি কাজ না করেন তবে কোনও সমস্যা নেই:

>>> r = range(2000, 2005)
>>> [(a+1,b) for (a,b) in enumerate(r)]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

>>> enumerate1 = lambda r:((a+1,b) for (a,b) in enumerate(r)) 

>>> list(enumerate1(range(2000,2005)))   # note - generator just like original enumerate()
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

1
>>> h = enumerate(range(2000, 2005))
>>> [(tup[0]+1, tup[1]) for tup in h]
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]

যেহেতু এটি কিছুটা ভারবস, তাই আপনার নিজের ফাংশনটি সাধারণীকরণের জন্য লেখার পরামর্শ দেব:

def enumerate_at(xs, start):
    return ((tup[0]+start, tup[1]) for tup in enumerate(xs))

2
গণনার একটি জেনারেটর হওয়া উচিত। প্রায়শই গ্রহণযোগ্য না হলে কেবল পুনরাবৃত্তি করতে একবারে একটি সম্পূর্ণ তালিকা তৈরি করা
জন লা রুই

0

আমি জানি না এই পোস্টগুলি কীভাবে আরও জটিল করা যেতে পারে তারপরে নিম্নলিখিতটি:

# Just pass the start argument to enumerate ...
for i,word in enumerate(allWords, 1):
    word2idx[word]=i
    idx2word[i]=word
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.