বিজোড় অবস্থানের তালিকার উপাদানগুলি বের করুন


102

সুতরাং আমি একটি তালিকা তৈরি করতে চাই যা কিছু বিদ্যমান তালিকার একটি সাবলিস্ট।

উদাহরণ স্বরূপ,

L = [1, 2, 3, 4, 5, 6, 7], আমি একটি sublist তৈরি করতে চান liযেমন যে liসব উপাদান রয়েছে Lবিজোড় অবস্থানের করেন।

যদিও আমি এটি করতে পারি

L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
    if count % 2 == 1:
        li.append(i)
    count += 1

তবে আমি জানতে চাই যে দক্ষতার সাথে এবং কম সংখ্যক পদক্ষেপে একইভাবে করার আরও একটি উপায় আছে কিনা।


@ ওয়ালিদখান: একটি প্রশ্নের মধ্যে কেন তার বোধগম্যতার তালিকা তৈরি করা দরকার?
তমারা উইজসম্যান

4
@ টমউইজসম্যান: তালিকা বোঝার জন্য । ইটিএ: উপেক্ষা করুন: আমি চারপাশে শিকার করেছি এবং আপনার এই উত্তরটি আবিষ্কার করেছি যা ইঙ্গিত করে যে আপনি মজা করছেন। পরের বার একটি হাসি মুখ রাখুন!
ডেভিড রবিনসন

4
@ ডেভিডরোবিনসন: তবে অন্য লোকেরা কি বলতে পারবেন যে, তিনি দুটি অস্পষ্ট শব্দ দিয়ে কী বোঝাতে চেয়েছেন তা ওপি-র কাছে পরিষ্কার নয়। কিছু মন্তব্য সহ এখানে এবং কেবল ছুরিকাঘাত করা, যাতে লোকেরা আরও ভাল লিখিত সামগ্রী প্রস্তুত করে এবং লিখতে থাকে; এবং ওপি বা দর্শকদের নির্বিঘ্নে এড়াতে ... :)
তামারা উইজসম্যান

উত্তর:


236

সমাধান

হ্যা, তুমি পারো:

l = L[1::2]

এবং এই সব। ফলাফলের মধ্যে নিম্নলিখিত অবস্থানগুলিতে রাখা উপাদানগুলি থাকবে ( 0-ভিত্তিতে, সুতরাং প্রথম উপাদানটি অবস্থানে রয়েছে 0, দ্বিতীয় স্থানে রয়েছে 1):

1, 3, 5

সুতরাং ফলাফল (প্রকৃত সংখ্যা) হবে:

2, 4, 6

ব্যাখ্যা

[1::2]শেষে শুধু তালিকা slicing জন্য স্বরলিপি হয়। সাধারণত এটি নিম্নলিখিত আকারে থাকে:

some_list[start:stop:step]

আমরা বাদ দিলে startডিফল্ট ( 0) ব্যবহার করা হবে। সুতরাং প্রথম উপাদানটি (অবস্থানের উপর 0, কারণ সূচী- 0ভিত্তিক) নির্বাচন করা হবে। এক্ষেত্রে দ্বিতীয় উপাদানটি নির্বাচন করা হবে।

দ্বিতীয় উপাদানটি বাদ দেওয়া হওয়ায়, ডিফল্টটি ব্যবহার করা হচ্ছে (তালিকার শেষ)। সুতরাং তালিকাটি দ্বিতীয় উপাদান থেকে শেষ পর্যন্ত পুনরাবৃত্তি করা হচ্ছে ।

আমরা তৃতীয় যুক্তি ( step) যা সরবরাহ করি 2। যার অর্থ একটি উপাদান বাছাই করা হবে, পরেরটি এড়িয়ে যাবে এবং আরও ...

সুতরাং, সংক্ষেপে, এই ক্ষেত্রে এর [1::2]অর্থ:

  1. দ্বিতীয় উপাদানটি নিন (যা উপায় দ্বারা, একটি বিজোড় উপাদান, যদি আপনি সূচক থেকে বিচার করেন),
  2. একটি উপাদান এড়িয়ে যান (কারণ আমাদের রয়েছে step=2, তাই আমরা একটিটিকে এড়িয়ে চলেছি, step=1যার বিপরীতে ডিফল্ট রয়েছে),
  3. পরবর্তী উপাদান নিন,
  4. পুনরাবৃত্তি পদক্ষেপ 2.-3। তালিকার শেষ না হওয়া পর্যন্ত,

সম্পাদনা : @ প্রিয়কুক্রেটি পাইথনের তালিকার স্লাইসিং স্বরলিপি সম্পর্কে আরও একটি ব্যাখ্যা দেওয়ার জন্য একটি লিঙ্ক দিয়েছেন। এখানে দেখুন: পাইথনের স্লাইস নোটেশন ব্যাখ্যা করুন

অতিরিক্ত - সাথে পাল্টা প্রতিস্থাপন enumerate()

আপনার কোডে, আপনি স্পষ্টভাবে কাউন্টার তৈরি এবং বৃদ্ধি করেছেন। পাইথনে এটি প্রয়োজনীয় নয়, কারণ আপনি কয়েকটি পুনরাবৃত্তির মাধ্যমে এটি গণনা করতে পারেন enumerate():

for count, i in enumerate(L):
    if count % 2 == 1:
        l.append(i)

উপরেরটি আপনি যে কোডটি ব্যবহার করছিলেন ঠিক ঠিক সেই একই উদ্দেশ্যে কাজ করে:

count = 0
for i in L:
    if count % 2 == 1:
        l.append(i)
    count += 1

forপাইথনে কাউন্টার সহ লুপগুলি অনুকরণ করার বিষয়ে আরও : পাইপনে সূচক অ্যাক্সেস করা 'লুপের জন্য'


@ টমউইজসম্যান অজগর কাটা সিনট্যাক্স বোঝার জন্য এই প্রশ্নটি দেখুন
প্রীত কুক্রেটি

প্রশ্নটি বিজোড় অবস্থানের জন্য জিজ্ঞাসা করে। এটি এমনকি অবস্থান দেয় (0,2,4,6); দেখে মনে হচ্ছে ওপি সূচকগুলি চায় (1,3,5), যা দেওয়া হবে [1,2,3,4,5,6,7][1::2]
মার্সিন

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

4
@ টমউইজসম্যান: আমি দুঃখিত, আপনি কী পরিবর্তন করেছেন তা আমি লক্ষ্য করি নি। প্রকৃতপক্ষে, একটি লিঙ্ক আছে, তবে এটি পাইমনের টুকরো টুকরো করে নয়, নুমারায় প্রকল্পে নিয়ে যায় list। এটি কিছুটা পৃথক হয়, বিশেষত কারণ listএর টুকরোটি মূল তালিকার রেফারেন্স রাখে না (নুমরেতে আপনাকে স্পষ্টভাবে কল .copy()করতে হবে এমন কিছু যা মূল অ্যারের উল্লেখ না করে)। তবে এমন কিছু পাওয়া ভাল লাগল যা কিছু পাঠকের পক্ষে ভাল। আপনি কি মন্তব্যটিতে এই লিঙ্কটি পোস্ট করতে আপত্তি করবেন, তাই আমি এটি upvote করতে পারি এবং এটি উত্তরের ঠিক নীচে প্রদর্শিত হবে?
টাডেক

@ টেডেক "বিজোড় সংখ্যাযুক্ত সূচকগুলি" বেশ স্বাভাবিকভাবেই সূচকগুলি যা বিজোড় সংখ্যা।
মার্সিন


5

আমি তাদের গণিত (সেট) সিনট্যাক্সের কারণে তালিকা বোঝার পছন্দ করি। সুতরাং এটি সম্পর্কে:

L = [1, 2, 3, 4, 5, 6, 7]
odd_numbers = [y for x,y in enumerate(L) if x%2 != 0]
even_numbers = [y for x,y in enumerate(L) if x%2 == 0]

মূলত, আপনি যদি একটি তালিকাতে গণনা করেন তবে আপনি সূচক xএবং মান পাবেন y। আমি এখানে যা করছি তা হ'ল মানটিকে yআউটপুট তালিকায় রাখে (এমনকি বা বিজোড়) এবং সূচকটি ব্যবহার করে xএটি নির্ধারণ করে যে বিন্দুটি বিজোড় ( x%2 != 0)।


4
এটি গণনা (আইটেম) পরিবর্তে গণনা করা (এল) করা উচিত নয়?
ab123

0

আপনি বিটওয়াইড এবং অপারেটরটি ব্যবহার করতে পারেন &। নীচে দেখুন:

x = [1, 2, 3, 4, 5, 6, 7]
y = [i for i in x if i&1]
>>> 
[1, 3, 5, 7]

বিটওয়্যার এবং অপারেটরটি 1 এর সাথে ব্যবহৃত হয় এবং এটি কাজ করে কারণ কারণ, বাইনারিতে লেখা বিজোড় সংখ্যাটির অবশ্যই প্রথম সংখ্যা 1 হিসাবে থাকা উচিত

23 = 1 * (2**4) + 0 * (2**3) + 1 * (2**2) + 1 * (2**1) + 1 * (2**0) = 10111
14 = 1 * (2**3) + 1 * (2**2) + 1 * (2**1) + 0 * (2**0) = 1110

এবং 1 এর সাথে ক্রিয়াকলাপটি কেবল 1 টি ফিরে আসবে (বাইনারিতে 1 টিতে শেষ সংখ্যা 1ও থাকবে), যদি মানটি বিজোড় হয়।

আরও জন্য পাইথন বিটওয়াইস অপারেটর পৃষ্ঠাটি দেখুন।

পিএস: আপনি যদি কোনও ডেটাফ্রেমে বিজোড় এবং এমনকি কলামগুলি নির্বাচন করতে চান তবে আপনি কৌশলগতভাবে এই পদ্ধতিটি ব্যবহার করতে পারেন। ধরা যাক ফেসিয়াল কী-পয়েন্টগুলির x এবং y স্থানাঙ্কগুলি কলাম X1, y1, x2, ইত্যাদি হিসাবে দেওয়া হয়েছে ... প্রতিটি চিত্রের প্রস্থ এবং উচ্চতার মানগুলির সাথে এক্স এবং y স্থানাঙ্ককে সাধারণ করতে আপনি কেবল সম্পাদন করতে পারেন

for i in range(df.shape[1]):
    if i&1:
        df.iloc[:, i] /= heights
    else:
        df.iloc[:, i] /= widths

এটি ঠিক প্রশ্নের সাথে সম্পর্কিত নয় তবে ডেটা বিজ্ঞানী এবং কম্পিউটার ভিশন ইঞ্জিনিয়ারদের জন্য এই পদ্ধতিটি কার্যকর হতে পারে।

চিয়ার্স!


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