বৃহত্তর তালিকায় প্রতিটি নবম আইটেমের তালিকা ফিরিয়ে আনার পাইথোনিক উপায়


170

বলুন আমাদের 0 থেকে 1000 পর্যন্ত সংখ্যার একটি তালিকা রয়েছে। প্রথম এবং পরবর্তী দশম আইটেমের তালিকা তৈরি করার জন্য কি অজগর / দক্ষ উপায় আছে, মানে [0, 10, 20, 30, ... ]?

হ্যাঁ, আমি লুপের জন্য এটি ব্যবহার করে এটি করতে পারি, তবে আমি ভাবছি যে এটি করার খুব সুন্দর উপায় আছে, সম্ভবত এমনকি এক লাইনে?

উত্তর:


289
>>> lst = list(range(165))
>>> lst[0::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]

নোট করুন যে এটি প্রতিটি উপাদানের জন্য লুপিং এবং একটি মডুলাস যাচাই করার চেয়ে প্রায় 100 গুণ বেশি দ্রুত:

$ python -m timeit -s "lst = list(range(1000))" "lst1 = [x for x in lst if x % 10 == 0]"
1000 loops, best of 3: 525 usec per loop
$ python -m timeit -s "lst = list(range(1000))" "lst1 = lst[0::10]"
100000 loops, best of 3: 4.02 usec per loop

4
অবশ্যই, তালিকা বোধগম্যতা সাধারণভাবে আরও শক্তিশালী। OTOH, প্রশ্ন একটি বিদ্যমান তালিকা পোষ্ট করে এবং সেই ক্ষেত্রে, একটি টুকরো ঠিক কাজ করে।
নেড ডিলি

আমি নীচে তালিকাটি বোঝার উত্তরগুলিতে মন্তব্য করেছি mented "যদি x% 10 == 0" থাকে তবে সাবধান হন। এটি কেবলমাত্র এই নির্দিষ্ট তালিকার উদাহরণের সাথেই কাজ করে তবে ইনপুট তালিকাটি উদাহরণস্বরূপ l = পরিসর (0,1000,2) হলে এটি প্রতি দশম আইটেমটি টেনে আনবে না।
আন্দ্রে মিলার

12
@ আন্ড্রে: খুব সত্য। সুতরাং এটি একটি নম্র ভাষার বৈশিষ্ট্যের উদাহরণ, স্লাইস অপারেটর, যা সঠিক ক্ষেত্রে এটি আরও সহজ করার জন্য (1) এই ক্ষেত্রে দেখা দেয়; (2) আরও সংক্ষিপ্ত প্রকাশের ফলাফল; এবং (3) দ্রুততর আকারের 2 ক্রম হতে পারে। (1) অবশ্যই এখন পর্যন্ত সবচেয়ে গুরুত্বপূর্ণ উদ্বেগ, তবে, ভাষাটির যত্ন সহকারে নকশা এবং প্রয়োগের জন্য আপনাকে তিনটি দামের জন্যই পেয়েছে 1. দুর্দান্ত প্রশ্ন এবং প্রতিক্রিয়া।
নেড ডিলি

2
0মধ্যে অপ্রয়োজনীয় l[0::10]l[::10]আরও পাঠযোগ্য, কম বিভ্রান্তিকর।
কনস্ট্যান্টিন শুবার্ট

আমি তালিকা বোধগম্যতার জন্য 0.5 সেকেন্ডের এবং পারফরম্যান্সের তুলনায় বিস্মিত হয়েছি list খুব ধীর বলে মনে হচ্ছে, তালিকার টুকরো টুকরো করার জন্য কেন 1 হাজার আকারের তালিকার জন্য 100 হাজার লুপের প্রয়োজন??
দামো

57
  1. source_list[::10] সর্বাধিক সুস্পষ্ট, তবে এটি কোনও পুনরাবৃত্তির পক্ষে কাজ করে না এবং বড় তালিকার জন্য মেমরি দক্ষ নয়।
  2. itertools.islice(source_sequence, 0, None, 10) যে কোনও পুনরাবৃত্তির পক্ষে কাজ করে এবং এটি মেমরি-দক্ষ, তবে সম্ভবত বড় তালিকা এবং বড় পদক্ষেপের জন্য দ্রুততম সমাধান নয়।
  3. (source_list[i] for i in xrange(0, len(source_list), 10))

1
+1 সেরা উত্তর, আইএমও। তিনটি প্রস্তাব একটি সাধারণ সমাধান (যেমন উত্স তালিকাটি প্রদত্ত হিসাবে গ্রহণ করুন)। উত্স তালিকার সূচকে ফিল্টার করা হওয়ায় জেনারেটর দ্রবণ (3.) দুর্দান্ত। এটি সম্ভবত মেমোরি হিসাবে দক্ষ হিসাবে 2। সূচক এবং ফলাফলের তালিকা উভয়ই জেনারেটর এবং এইভাবে অলসভাবে নির্মিত হয়, এটি সম্ভবত দ্রুততম যদি আপনার কোনও একক ফলাফলের তালিকা প্রয়োজন না হয়। যদি উত্স তালিকার কোনও জেনারেটর হতে পারে তবেই আমি পলের "আইটেমটি, গণনায় (এল)" অভিবাদনটি নিয়ে যেতে পারি, কারণ কোনও জেনারেটরের কোনও লেন () নেই। বিটিডাব্লু, কোন ধরণের পুনরাবৃত্তি 1. এর সাথে কাজ করবে না? জেনারেটর ?!
টমাস এইচ

শ্রদ্ধেয় = __iter __ () পদ্ধতিতে পুনরাবৃত্তি পুনরাবৃত্তকারী (পরবর্তী () পদ্ধতির সাথে বস্তু)
ডেনিস ওটকিডাচ


19

ম্যানুয়াল থেকে: s[i:j:k] slice of s from i to j with step k

li = range(100)
sub = li[0::10]

>>> sub
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]


4

কেন পেতে কেবল সীমার ক্রিয়াটির একটি পদক্ষেপ পরামিতি ব্যবহার করবেন না :

l = range(0, 1000, 10)

তুলনায়, আমার মেশিনে:

H:\>python -m timeit -s "l = range(1000)" "l1 = [x for x in l if x % 10 == 0]"
10000 loops, best of 3: 90.8 usec per loop
H:\>python -m timeit -s "l = range(1000)" "l1 = l[0::10]"
1000000 loops, best of 3: 0.861 usec per loop
H:\>python -m timeit -s "l = range(0, 1000, 10)"
100000000 loops, best of 3: 0.0172 usec per loop

3
@ সাইলেন্টগোস্ট: এটি সত্য, তবে এটি একটি প্রাথমিক প্রশ্ন হিসাবে পরিসীমা ফাংশনটি তারা কী করতে চায় তা হতে পারে , তাই আমি মনে করি এটি একটি বৈধ উত্তর। (যদিও উপরের সীমাটি 1001 নয়, 1000 নয়)
স্কট গ্রিফিথস

2
existing_list = range(0, 1001)
filtered_list = [i for i in existing_list if i % 10 == 0]

1
রেঞ্জ (0, 1001, 10) ইতিমধ্যে কেবলমাত্র প্রতি 10 তম উপাদান নিয়ে থাকে তবে আপনার যদি ক্লজটি থাকে?
স্বয়ংবৃক্ষ

4
এখানে একই মন্তব্য, এটি "বৃহত্তর তালিকায় প্রতিটি এন'থ আইটেমের তালিকা ফিরিয়ে দেওয়ার পাইথোনিক উপায়" এর আরও সাধারণ সমস্যাটির সমাধান করে না আপনার সমাধানটি তালিকার উপর নির্ভর করে যে উদাহরণের তালিকার মানগুলি 0 থেকে 1000 এবং কেবলমাত্র আইটেমগুলিকে টানছে তালিকার বাইরে যা প্রতি দশম আইটেমের পরিবর্তে 10 দ্বারা বিভাজ্য মান রয়েছে।
আন্দ্রে মিলার

1
ঠিক আছে, ওপি লিখেছেন: "আমাদের কাছে শূন্য থেকে 1000 এর সংখ্যার একটি তালিকা আছে"। সুতরাং তার কোনও সাধারণ সমাধানের প্রয়োজন নেই।

1
তিনি লিখেছেন 'বলুন আমাদের আছে ..' যা এর উদাহরণ হিসাবে বোঝায়। যদি তিনি সত্যিই শূন্য থেকে 1000 এর তালিকার প্রতিটি দশম নম্বর চেয়েছিলেন তবে উত্তরটি পরিসীমা (0,1001,10) বা অনুরূপ কিছু হবে।
আন্দ্রে মিলার

1

এখানে "প্রতি দশম আইটেম" তালিকার উপলব্ধি আরও উন্নত করা হয়েছে, যা সদস্যপদ পরীক্ষার অংশ হিসাবে তালিকার বিষয়বস্তু ব্যবহার করে না:

>>> l = range(165)
>>> [ item for i,item in enumerate(l) if i%10==0 ]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
>>> l = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
>>> [ item for i,item in enumerate(l) if i%10==0 ]
['A', 'K', 'U']

তবে এটি কেবল তালিকা স্লাইসিং ব্যবহারের চেয়ে অনেক ধীর গতির।


-9

তালিকার বোধগম্যতা ঠিক সেই জন্য তৈরি করা হয়েছে:

smaller_list = [x for x in range(100001) if x % 10 == 0]

আপনি পাইথন কর্মকর্তা ডকুমেন্টেশন তাদের সম্পর্কে আরও তথ্য পেতে পারেন: http://docs.python.org/tutorial/datastructures.html#list-comprehensions


উপরের সীমাটি 10000 নয়, 1000 হওয়া উচিত Your

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