পাইথন তালিকার নবম উপাদান কীভাবে পাওয়া যায় বা যদি না পাওয়া যায় তবে একটি ডিফল্ট


143

আমি dictionary.get(key, default)তালিকাগুলির অজগরটিতে একটি সমমানের সন্ধান করছি । তালিকার নবম উপাদান বা যদি না পাওয়া যায় তবে ডিফল্ট মান পেতে কোনও লাইনার আইডিয়াম আছে?

উদাহরণস্বরূপ, একটি তালিকা দেওয়া আমার তালিকাটি আমি পেতে চাই myList[0], বা 5 যদি myListখালি তালিকা হয়।

ধন্যবাদ।

উত্তর:


123
l[index] if index < len(l) else default

নেতিবাচক সূচকগুলি সমর্থন করতে আমরা ব্যবহার করতে পারি:

l[index] if -len(l) <= index < len(l) else default

3
যদি আপনার তালিকার নাম না থাকে তবে কাজ করে না - উদাহরণস্বরূপ, তালিকা বোধে।
জিওনগ চিয়ামিভ

9
আপনি নেতিবাচক সূচকের ক্ষেত্রে ভুলে গেছেন বলে মনে হচ্ছে। যেমন। index == -1000000ফিরে আসা উচিত default
নোডাকাই

3
@ নোডাকাই, ভালো কথা। আমাকে মাঝে মাঝে কামড়ে ফেলেছে। x[index] if 0 <= index < len(x) else defaultযদি indexকখনও নেতিবাচক হতে পারে তবে ভাল হত ।
বেন হোয়েট

3
@ নোডাকাই বাহ - এটি পরীক্ষার সঠিক কোড দেওয়ার চেষ্টা করার চেয়ে চেষ্টা করা / বাদ দিয়ে কেন ব্যবহার করা ভাল হতে পারে তার একটি দুর্দান্ত উদাহরণ এটি কখনই ব্যর্থ হয় না। আমি জানি যে কেসটি ঘটবে তা আমি জানি / বাদে চেষ্টা করা নির্ভর করি না, তবে এটি আমার বিবেচনা করতে আগ্রহী করে তোলে।
টুলমেকারস্টেভ

6
@ টুলমেকারস্টেভ: এর জন্য আপনার সূত্রটি valid_index()ভুল। নেতিবাচক সূচকের হয় পাইথন আইনি - এটি হওয়া উচিত -len(l) <= index < len(l)
টিম পিটজ্যাকার

57
try:
   a = b[n]
except IndexError:
   a = default

সম্পাদনা করুন: আমি টাইপ-এররারের জন্য চেকটি সরিয়েছি - কলকারীকে এটি পরিচালনা করতে দেওয়া ভাল।


3
আমি এই পছন্দ। এটি কেবল কোনও ফাংশনটির চারপাশে মুড়ে রাখুন যাতে আপনি এটি একটি আর্গুমেন্ট হিসাবে আর্গুমেন্ট হিসাবে কল করতে পারেন। পড়া সহজ।
নওফাল ইব্রাহিম

35
(a[n:]+[default])[0]

এটি সম্ভবত ভাল হিসাবে aবৃহত্তর পায়

(a[n:n+1]+[default])[0]

এটি কাজ করে কারণ যদি a[n:]খালি তালিকা থাকে তবেn => len(a)

এটি কীভাবে কাজ করে তার একটি উদাহরণ এখানে range(5)

>>> range(5)[3:4]
[3]
>>> range(5)[4:5]
[4]
>>> range(5)[5:6]
[]
>>> range(5)[6:7]
[]

এবং সম্পূর্ণ প্রকাশ

>>> (range(5)[3:4]+[999])[0]
3
>>> (range(5)[4:5]+[999])[0]
4
>>> (range(5)[5:6]+[999])[0]
999
>>> (range(5)[6:7]+[999])[0]
999

5
আপনি কি এটি ব্যাখ্যা করার জন্য একটি মন্তব্য ছাড়াই প্রকৃত কোডে এটি লিখবেন?
পিটার হানসেন

1
@ পিটার হানসেন, কেবল যদি আমি গল্ফ করছিলাম;) তবে পাইথনের সমস্ত সংস্করণে এটি কাজ করে । স্বীকৃত উত্তরটি কেবলমাত্র 2.5+
জন লা রুই

3
এটি আইটেম নির্বাচন করার জন্য 3 টি অস্থায়ী তালিকা তৈরি এবং 2 সূচক অ্যাক্সেস করে।
জোছিম জাবলন

যদিও আমি এটি "রিয়েল" কোডে কখনই করব না, এটি একটি দুর্দান্ত সংক্ষিপ্ত ওয়ান-লাইনার যা আমি খুব সহজেই একটি অজগরকে REPL তে ব্যবহার করতে পারি, সুতরাং আপনি আমার উত্সাহ পেতে পারেন।
কুকিট

next(iter(lst[i:i+1]), default)- ক্রিপ্টিক কুরুচিপূর্ণ ওয়ান-লাইনার প্রতিযোগিতায় কেবলমাত্র আরেকটি প্রবেশ
jfs

28

সবেমাত্র এটি আবিষ্কার হয়েছে:

next(iter(myList), 5)

iter(l)একটি পুনরাবৃত্তির উপর ফেরত দেয় myList, next()পুনরুদ্ধারকের প্রথম উপাদানটি গ্রাস করে এবং StopIterationএকটি ডিফল্ট মান হিসাবে ডাকা না হলে একটি ত্রুটি উত্থাপন করে , যা এখানে মামলা, দ্বিতীয় যুক্তি,5

এটি কেবল তখনই কাজ করে যখন আপনি 1 ম উপাদানটি চান, যা আপনার উদাহরণের ক্ষেত্রে এটি তবে আপনার প্রশ্নের পাঠ্যটিতে নয়, তাই ...

অতিরিক্তভাবে, এটি মেমরিতে অস্থায়ী তালিকা তৈরি করার প্রয়োজন হয় না এবং এটি কোনও ধরণের পুনরাবৃত্তির জন্য কাজ করে, এমনকি এর নাম না থাকলেও (জিওনজ চিয়ামিভের গ্রাসস্কির উত্তর সম্পর্কে মন্তব্য দেখুন)


3
অন্যান্য উত্তরগুলির সাথে সম্মিলিত: next(iter(myList[n:n+1]), 5) এখন এটি nতম উপাদানটির জন্য কাজ করে ।
আলফ

নন তালিকার সাথে এটি কাজ করবে না। এই মুহুর্তে, চেষ্টা করুন: ইনডেক্সেরর-বাদ দিয়ে আরও ভাল আইএমএইচওর মতো পড়া reads এছাড়াও, এটি স্মৃতিতে একটি তালিকা তৈরি করে।
জোছিম জাবলন

tryবৈকল্পিক এক মাছ ধরার নৌকা (ওপি দ্বারা চাইলেন জানতে চান) নয়। এটি কেবল তালিকাগুলির জন্য কাজ করে কারণ myListওপি দ্বারা সুনির্দিষ্টভাবে একটি তালিকা (সুনির্দিষ্টভাবে বলতে গেলে এটি সূচকযোগ্য কিছু)। মেমোরিতে একটি অনুলিপি তৈরি করা এখানে ব্যয়বহুল নয় কারণ আমি এখানে একটি একক (বা কিছুই নয়) উপাদানের একটি তালিকা তৈরি করছি। অবশ্যই, কিছুটা ওভারহেড, তবে আপনি যদি লুপটিতে লক্ষ লক্ষ বার না করেন তবে তা উল্লেখ করার মতো নয়। বিটিডব্লু, আমার ধারণা, একটি IndexErrorব্যতিক্রম তৈরি করা এবং ধরা সম্ভবত সম্ভবত ব্যয়বহুল।
Alfe

পঠনযোগ্যতা গণনা করা হয় :) আপনি যদি এমন কোনও স্থানে থাকেন যেখানে কোনও সূচিপত্র উত্থাপনের একটি উল্লেখযোগ্য ব্যয় হয় তবে সম্ভবত আপনাকে পাইথনের পুরো কাজটি করা উচিত।
জোছিম জাবলন

20
(L[n:n+1] or [somedefault])[0]

1
+1 কারণ এটি আমাকে কী [] or ...করতে শিখিয়েছে । যাইহোক, আমি ব্যক্তিগতভাবে কেবল গ্রহণযোগ্য সমাধানটি ব্যবহার করব, কারণ এটি সহজেই পড়ে (আভিজাত্যের জন্য)। মঞ্জুর, মন্তব্যে একটি 'ডিফ' এ মোড়ানো এটি বেশিরভাগ ক্ষেত্রে একটি অ-ইস্যু করে তুলবে।
টুলমেকারস্টেভ

কি হবে যদি L[n] == Falseবা L[n] == Noneবা L[n] == []বা একাধিক বিশ্বব্যাপী যে কিছু মিথ্যা মূল্যায়ণ?
জোচিম জাবলন

@ জোয়াচিম জাবলন: এখনও কাজ করে। স্লাইস একটি তালিকা দেয়, এবং [False]সত্য।
ইগনাসিও ওয়াজকেজ-আব্রামস

ওহ, বুঝতে পারছি না যে তালিকাটি চেক করা হয়েছে এবং মানটি নয় indeed
জোয়াকিম জাবলন

আপনি এটিকে একটি টিপলে জড়িয়ে রাখছেন কেন? আমার মনে হয় myval = l[n:n+1] or [somedefault]ঠিক কাজ করবে?
রোটারেটি

8

... dict.get(key, default)তালিকাগুলির জন্য অজগরটির সমতুল্য সন্ধান করছি

একটি ইটারটুল রেসিপি রয়েছে যা সাধারণ পুনরাবৃত্তির জন্য এটি করে। সুবিধার জন্য, আপনি > pip install more_itertoolsএবং এই তৃতীয় পক্ষের লাইব্রেরি আমদানি করতে পারেন যা আপনার জন্য এই জাতীয় রেসিপিগুলি কার্যকর করে:

কোড

import more_itertools as mit


mit.nth([1, 2, 3], 0)
# 1    

mit.nth([], 0, 5)
# 5    

বিস্তারিত

এই nthরেসিপি বাস্তবায়ন :

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(itertools.islice(iterable, n, None), default)

পছন্দ করুন dict.get(), এই সরঞ্জামটি অনুপস্থিত সূচকগুলির জন্য একটি ডিফল্ট ফিরিয়ে দেয়। এটি সাধারণ পুনরাবৃত্তির ক্ষেত্রে প্রযোজ্য:

mit.nth((0, 1, 2), 1)                                      # tuple
# 1

mit.nth(range(3), 1)                                       # range generator (py3)
# 1

mit.nth(iter([0, 1, 2]), 1)                                # list iterator 
# 1  

2

একটি স্বল্প সমাধান হ'ল গণনা সহ একটি ডিক তৈরি করা এবং .get()যথারীতি যথাযথ ব্যবহার করা

 dict(enumerate(l)).get(7, my_default)

1

উপরের সাথে @ জোয়াকিমের সংমিশ্রণ, আপনি ব্যবহার করতে পারেন

next(iter(my_list[index:]), default)

উদাহরণ:

next(iter(range(10)[8:]), 11)
8
>>> next(iter(range(10)[12:]), 11)
11

বা, সম্ভবত আরও পরিষ্কার, কিন্তু ছাড়া len

my_list[index] if my_list[index:] else default

1

পাইথন ৩.৪ এর অনুরূপ contextlib.suppress(exceptions)একটি getitem()পদ্ধতি তৈরি করতে getattr()

import contextlib

def getitem(iterable, index, default=None):
    """Return iterable[index] or default if IndexError is raised."""
    with contextlib.suppress(IndexError):
        return iterable[index]
    return default
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.