কোনও তালিকা ফাঁকা আছে কিনা তা আমি কীভাবে পরীক্ষা করব?


3234

উদাহরণস্বরূপ, নিম্নলিখিতটি পাস হলে:

a = []

aখালি আছে কিনা তা আমি কীভাবে চেক করব ?

উত্তর:


5486
if not a:
  print("List is empty")

ব্যবহার অন্তর্নিহিত booleanness খালি listবেশ pythonic হয়।


1126
শয়তানের উকিল বাজানো। আমি বুঝতে পারছি না কেন এই প্রতিমাটিকে অজগর হিসাবে বিবেচনা করা হয়। 'স্পষ্টত আরও ভাল তবে অন্তর্নিহিত', সঠিক? এই চেকটি যা চেক করছে সে সম্পর্কে খুব স্পষ্ট মনে হয় না।
জেমস ম্যাকমাহন

221
@ জেমসম্যাকমাহন - এটি এক্সপ্লোসিটিস এবং টাইপ নমনীয়তার মধ্যে একটি বাণিজ্য trade সাধারণত, "সুস্পষ্ট হওয়া" মানে "জাদুকরী" জিনিস না করা। অন্যদিকে, "হাঁসের টাইপিং" এর অর্থ স্পষ্টভাবে প্রকারের জন্য পরীক্ষা করার চেয়ে আরও সাধারণ ইন্টারফেসের সাথে কাজ করা। সুতরাং এর মতো কিছু if a == []একটি নির্দিষ্ট ধরণের ( () == []is False) জোর করে is এখানে, সাধারণ sensকমত্য বলে মনে হচ্ছে যে হাঁসের টাইপিং জিতেছে (ফলস্বরূপ, এটি __nonzero__শূন্যতার ডকস.প্যাথন.আর. / রেফারেন্স / ডাডামোডেল। html#object.__nonzero__ ) পরীক্ষা করার ইন্টারফেস
অ্যান্ড্রু কুক

38
এই পদ্ধতিটি ন্যালি অ্যারেগুলিতে কাজ করে না .. সুতরাং আমি মনে করি যদি "হাঁসের টাইপিং" এবং ফলস্বরূপ উভয় ক্ষেত্রে লেন (ক) == 0 ভাল হয় is
মিস্টার ওয়ার্সশিপ

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

6
@ ব্রেনেনস্প্রিমন্ট, যদি এটি বাতিল হয় না, তবে আপনি ইতিমধ্যে দৈর্ঘ্যটি জানেন, এটি কোনও পৃথক ভেরিয়েবলে সঞ্চিত আছে বা আপনার অ্যারে এমন কিছু ধারক জড়িত যা দৈর্ঘ্যটি ট্র্যাক করে। সি ++, জাভা, সি # এ জাতীয় ধারক রয়েছে এবং দক্ষতার সাথে কিছু "দৈর্ঘ্য" পদ্ধতি প্রয়োগ করে। সি এর তেমন কোন জিনিস নেই , আপনাকে নিজের রোল করতে হবে। পরিসংখ্যানগতভাবে বরাদ্দ করা সি অ্যারে কেবলমাত্র একটি মেমরি স্পেসের পয়েন্টার যা আপনার অনুরোধ করা ডেটার পরিমাণ সঞ্চয় করার জন্য পর্যাপ্ত জায়গা থাকার গ্যারান্টিযুক্ত। সি তে অন্তর্নির্মিত কিছুই নেই যা আপনাকে জানাতে দেবে যে আপনি ইতিমধ্যে সেই স্থানটি কতটা পূরণ করেছেন।
sleblanc

1158

এটি করার অজগর উপায়টি হল পিইপি 8 স্টাইল গাইড (যেখানে হ্যাঁর অর্থ "প্রস্তাবিত" এবং কোনও অর্থ "প্রস্তাবিত নয়"):

সিকোয়েন্সগুলির জন্য, (স্ট্রিং, তালিকাগুলি, টিপলস) খালি সিকোয়েন্সগুলি মিথ্যা রয়েছে তা ব্যবহার করুন।

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):

49
দ্বিতীয় উপায়টি যদি আপনি সিগন্যাল করতে চান তবে seqএটি কোনও ধরণের তালিকার মতো অবজেক্ট হিসাবে প্রত্যাশিত better
বলপয়েন্টবেন

5
@ বালপয়েন্টপেন যা, পাইথনিজমের সমর্থকরা বলবেন, ভেরিয়েবলটির যতটা সম্ভব নামকরণ করা উচিত, যতটা সম্ভব সম্ভব
এক্সোলোটল

9
ভেরিয়েবলটি কী হতে হবে তার সিগন্যাল দেওয়ার জন্য @ বালপয়েন্টপেন পাইথনের ধরণের ইঙ্গিতটি ব্যবহার করার চেষ্টা করুন । এটি চালু হয়েছিল 3.5।
বরিস

8
নম্পি এই আইডিয়মটি ভেঙে দিয়েছে ... seq = numpy.array ([1,2,3]) এরপরে যদি সিক না হয় তবে একটি ব্যতিক্রম উত্থাপন করে "ValueError: একাধিক উপাদান সহ একটি অ্যারের সত্য মান অস্পষ্ট। () বা এ.এল () "
মিস্টার ওয়ার্সশিপ 20'19

2
@ জেরনিমো: আমি বিশ্বাস করি যে এটি একটি এক্সএক্সএমএল-নির্দিষ্ট সতর্কতা।
হারলে হলকম্ব

765

আমি এটিকে স্পষ্টভাবে পছন্দ করি:

if len(li) == 0:
    print('the list is empty')

এইভাবে এটি 100% স্পষ্ট যে liএটি একটি ক্রম (তালিকা) এবং আমরা এর আকারটি পরীক্ষা করতে চাই। আমার সমস্যাটি if not li: ...হ'ল এটি মিথ্যা ধারণা দেয় liযা একটি বুলিয়ান পরিবর্তনশীল।


91
তালিকার দৈর্ঘ্য শূন্যের সমান কিনা তা যাচাই করা, তালিকাটি মিথ্যা কিনা তা খতিয়ে দেখার চেয়ে, কুৎসিত এবং অপার্থিব। পাইথনের সাথে পরিচিত যে কেউ liএটিকে একেবারেই শান্ত মনে করবে না , এবং যত্ন নেবে না । যদি এটি গুরুত্বপূর্ণ হয়, আপনার একটি মন্তব্য যুক্ত করা উচিত, আরও কোড নয়।
কার্ল স্মিথ

21
এটি একটি অপ্রয়োজনীয় নির্ভুল পরীক্ষার মতো বলে মনে হচ্ছে যা প্রায়শই ধীর হয় এবং সর্বদা কম পঠনযোগ্য আইএমএইচও হয়। খালি কোনও কিছুর আকার পরীক্ষা করার পরিবর্তে খালি এটি খালি কিনা তা যাচাই করে না কেন?
জন বি

34
যাইহোক, এর কারণটি খারাপ (এবং পাইথনের মতো দৃ id় প্রতিমাগুলির সাথে কোনও ভাষায় আইডিয়ামগুলি লঙ্ঘন করা) এটি পাঠকের পক্ষে সংকেত দেয় যে আপনি নির্দিষ্টভাবে কোনও কারণে দৈর্ঘ্যটি পরীক্ষা করছেন (যেমন, আপনি চান Noneবা কারণ 0পাস করার চেয়ে ব্যতিক্রম বাড়াতে)। সুতরাং যখন আপনি কোন কারণে, যে জন্য এটা করতে বিভ্রান্তিকর-এবং এটি মানে হল যখন আপনার কোড আছে পার্থক্য করতে প্রয়োজন নেই, পার্থক্য অদৃশ্য কারণ আপনি "চিৎকার করে বললেন নেকড়ে" সব উৎস বাকি ওভার করেছি।
abarnert

18
আমি মনে করি এটি অযথা কোড দীর্ঘায়িত করছে। অন্যথায়, কেন আরও "স্পষ্ট" না if bool(len(li) == 0) is True:?
'40

11
@ জাবা এটি অনেক ক্ষেত্রে O (1) হবে ( আপনি যেখানে অন্তর্নির্মিত ডেটা ধরণের সাথে কাজ করেন) তবে আপনি এটির উপর নির্ভর করতে পারবেন না। আপনি হয়ত কোনও কাস্টম ডেটা ধরণের সাথে কাজ করছেন যাতে এই সম্পত্তিটি নেই। আপনি ইতিমধ্যে এই কোডটি লিখে দেওয়ার পরে, এই কাস্টম ডেটা প্রকারটি পরে যুক্ত করার সিদ্ধান্ত নিতে পারেন।
রোকলত

324

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

অন্যান্য পদ্ধতি NumPy অ্যারেগুলির জন্য কাজ করে না

আপনাকে NumPy অ্যারেগুলি সম্পর্কে সতর্কতা অবলম্বন করা উচিত, কারণ অন্যান্য পদ্ধতিগুলি যেগুলি listবা অন্যান্য স্ট্যান্ডার্ড পাত্রে NumPy অ্যারেগুলির জন্য সূক্ষ্ম কাজ করে। আমি নীচে কেন তা ব্যাখ্যা করছি, তবে সংক্ষেপে, পছন্দসই পদ্ধতিটি ব্যবহার করা size

"পাইথোনিক" উপায়টি কাজ করে না: পর্ব 1

"Pythonic" পথ NumPy অ্যারে সঙ্গে ব্যর্থ কারণ NumPy একটি অ্যারের অ্যারের নিক্ষেপ করার চেষ্টা করে bools, এবং if xচেষ্টা ঐ সব মূল্যায়নের boolসমষ্টিগত সত্য মান কোন ধরণের জন্য একবারে গুলি। তবে এটি কোনও অর্থবোধ করে না, সুতরাং আপনি এটি পান ValueError:

>>> x = numpy.array([0,1])
>>> if x: print("x")
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

"পাইথোনিক" উপায়টি কাজ করে না: পার্ট 2

তবে কমপক্ষে উপরের কেসটি আপনাকে বলে যে এটি ব্যর্থ হয়েছে। আপনার যদি ঠিক একটি উপাদানের সাথে একটি নুমপি অ্যারে থাকে তবে ifবিবৃতিটি "কাজ করবে" এই অর্থে যে আপনি কোনও ত্রুটি পাবেন না। তবে, যদি সেই একটি উপাদানটি 0(বা 0.0, বা False, ...) হয়ে থাকে তবে ifবিবৃতিটি ভুলভাবে ফলাফল করবে False:

>>> x = numpy.array([0,])
>>> if x: print("x")
... else: print("No x")
No x

তবে স্পষ্টভাবে xবিদ্যমান এবং খালি নেই! এই ফলাফলটি আপনি চেয়েছিলেন তা নয়।

ব্যবহার lenঅপ্রত্যাশিত ফলাফল দিতে পারে

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

len( numpy.zeros((1,0)) )

অ্যারেতে শূন্য উপাদান থাকা সত্ত্বেও 1 প্রদান করে।

নমপিথোনিক উপায়

সায়পাই এফএকিউ-তে ব্যাখ্যা করা হয়েছে যে সমস্ত ক্ষেত্রেই আপনি জানেন যে আপনার কাছে নম্পপি অ্যারে রয়েছে সঠিক পদ্ধতিটি হ'ল if x.size:

>>> x = numpy.array([0,1])
>>> if x.size: print("x")
x

>>> x = numpy.array([0,])
>>> if x.size: print("x")
... else: print("No x")
x

>>> x = numpy.zeros((1,0))
>>> if x.size: print("x")
... else: print("No x")
No x

এটি যদি একটি list, নুমপি অ্যারে বা অন্য কিছু হতে পারে তা আপনি যদি নিশ্চিত না হন তবে আপনি এই পদ্ধতির সাথে উত্তরটি সংযুক্ত করতে পারেন @ সন্দেহভাজনজিম প্রতিটি ধরণের জন্য সঠিক পরীক্ষাটি ব্যবহার করা হয়েছে তা নিশ্চিত করে। খুব "পাইথোনিক" নয়, তবে এটি প্রমাণিত হয়েছে যে নম্পপি ইচ্ছাকৃতভাবে কমপক্ষে এই অর্থে অজগরটিকে ভেঙেছে।

যদি আপনাকে কেবল ইনপুটটি খালি আছে কিনা তা পরীক্ষা করে দেখার প্রয়োজন হয় এবং আপনি অন্যান্য নুমপি বৈশিষ্ট্য যেমন ইনডেক্সিং বা গণিত ক্রিয়াকলাপগুলি ব্যবহার করছেন তবে ইনপুটটিকে নুমপি অ্যারে হিসাবে বাধ্য করা সম্ভবত আরও দক্ষ (এবং অবশ্যই আরও সাধারণ) । এটি দ্রুত করার জন্য কয়েকটি দুর্দান্ত ফাংশন রয়েছে - সর্বাধিক গুরুত্বপূর্ণ numpy.asarray। এটি আপনার ইনপুট নেয়, এটি ইতিমধ্যে কোনও অ্যারে থাকলে কিছুই করে না, বা আপনার ইনপুটটিকে কোনও তালিকা, টুপল ইত্যাদিতে আবদ্ধ করে এবং andচ্ছিকভাবে এটি আপনার নির্বাচিতকে রূপান্তর করে dtype। সুতরাং এটি যখনই হতে পারে খুব দ্রুত এবং এটি নিশ্চিত করে যে আপনি কেবল ইনপুটটি একটি NumPy অ্যারে ধরে নিয়েছেন। আমরা সাধারণত এমনকি একই নামটি ব্যবহার করি, কারণ একটি অ্যারেতে রূপান্তরকরণ এটি বর্তমান সুযোগের বাইরে ফিরিয়ে আনবে না :

x = numpy.asarray(x, dtype=numpy.double)

এটি x.sizeএই পৃষ্ঠায় যে সমস্ত ক্ষেত্রে আমি দেখছি তাতে চেকটি কাজ করবে ।


62
এটি লক্ষণীয় যে এটি পাইথনের কোনও ত্রুটি নয়, বরং এটি দ্বারা ইচ্ছাকৃতভাবে চুক্তিভঙ্গ করা numpy- numpyএটি একটি খুব নির্দিষ্ট ব্যবহারের ক্ষেত্রে একটি লাইব্রেরি এবং এটির ক্ষেত্রে সত্যতা কী তার একটি আলাদা 'প্রাকৃতিক' সংজ্ঞা রয়েছে ধারকগুলির জন্য পাইথন স্ট্যান্ডার্ড। এটা তোলে ভাবে যে ক্ষেত্রে জন্য নিখুত জ্ঞান করে তোলে, যে pathlibব্যবহারসমূহ /পরিবর্তে CONCATENATE পাথ +- এটা অ-মানক, কিন্তু প্রেক্ষাপটে জ্ঞান করে তোলে।
গ্যারেথ লেটি

9
একমত। আমার বক্তব্যটি কেবল এটুকু মনে রাখা জরুরী যে নিম্পি খুব সাধারণ if xএবং প্রতিমা উভয়ের জন্য হাঁসের টাইপিং ভাঙ্গার পছন্দ করেছে len(x)- এবং কখনও কখনও এই ভাঙ্গা সনাক্ত করা এবং ডিবাগ করা খুব কঠিন হতে পারে।
মাইক 21

22
আমি জানি না, আমার জন্য, যদি লেন (এক্স) নামক কোনও পদ্ধতি অ্যারের দৈর্ঘ্যটি ফেরত না দেয় কারণ অনুমানের কারণে, এটির নামটি খারাপ ডিজাইন করা হয়েছে।
ডাল্টন

11
এই প্রশ্নের অদম্য অ্যারেগুলির সাথে কোনও সম্পর্ক নেই
পিপ্পারি

19
@ পিপ্পেরি হ্যাঁ, মূল প্রশ্নটি নম্পি অ্যারে সম্পর্কে নয়, তবে সেইগুলি এবং সম্ভবত টাইপ করা যুক্তিগুলির সাথে কাজ করার সময়, এই প্রশ্নটি খুব প্রাসঙ্গিক হয়ে ওঠে।
পিটারহিল

222

কোনও তালিকা খালি আছে কিনা তা যাচাই করার সর্বোত্তম উপায়

উদাহরণস্বরূপ, নিম্নলিখিতটি পাস হলে:

a = []

একটি খালি আছে কিনা তা আমি কীভাবে চেক করব?

সংক্ষিপ্ত উত্তর:

একটি বুলিয়ান প্রেক্ষাপটে তালিকা রাখুন (উদাহরণস্বরূপ, একটি সঙ্গে ifবা whileবিবৃতি)। এটি Falseখালি আছে কিনা তা পরীক্ষা করবে এবং Trueঅন্যথায়। উদাহরণ স্বরূপ:

if not a:                           # do this!
    print('a is an empty list')

পিইপি 8

পাইপ 8 , পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে পাইথন কোডের জন্য অফিসিয়াল পাইথন শৈলীর গাইড, দৃser়ভাবে দাবি করে:

সিকোয়েন্সগুলির জন্য, (স্ট্রিং, তালিকাগুলি, টিপলস) খালি সিকোয়েন্সগুলি মিথ্যা রয়েছে তা ব্যবহার করুন।

Yes: if not seq:
     if seq:

No: if len(seq):
    if not len(seq):

আমাদের আশা করা উচিত যে স্ট্যান্ডার্ড লাইব্রেরি কোডটি যথাসম্ভব পারফরম্যান্ট এবং সঠিক হওয়া উচিত। তবে কেন এটি হল এবং কেন আমাদের এই নির্দেশিকাটির দরকার?

ব্যাখ্যা

আমি প্রায়শই পাইথনে নতুন অভিজ্ঞ প্রোগ্রামারদের কাছ থেকে এই জাতীয় কোড দেখতে পাই:

if len(a) == 0:                     # Don't do this!
    print('a is an empty list')

এবং অলস ভাষার ব্যবহারকারীরা এটি করার জন্য প্রলুব্ধ হতে পারে:

if a == []:                         # Don't do this!
    print('a is an empty list')

এগুলি তাদের নিজ নিজ অন্যান্য ভাষায় সঠিক। এবং পাইথনে এটি শব্দার্থগতভাবে সঠিক।

তবে আমরা একে অ-পাইথোনিক হিসাবে বিবেচনা করি কারণ পাইথন এই শব্দার্থকগুলিকে সরাসরি বুলিয়ান জবরদস্তির মাধ্যমে তালিকার অবজেক্টের ইন্টারফেসে সমর্থন করে।

দস্তাবেজগুলি থেকে (এবং বিশেষ করে খালি তালিকার অন্তর্ভুক্তির বিষয়টি লক্ষ্য করুন []):

ডিফল্টরূপে, অবজেক্টটিকে সত্য হিসাবে বিবেচনা করা হয় যদি না তার শ্রেণি দ্বারা হয় এমন কোনও __bool__()পদ্ধতি নির্ধারণ করা হয় যা প্রত্যাবর্তনের সাথে ডাকা হয় Falseবা ফিরে আসে এমন কোনও __len__()পদ্ধতি যা শূন্য ফিরে আসে। এখানে বেশিরভাগ বিল্ট-ইন অবজেক্টকে মিথ্যা হিসাবে বিবেচনা করা হচ্ছে:

  • ধ্রুবকগুলি মিথ্যা হিসাবে সংজ্ঞায়িত: Noneএবং False
  • কোনো সাংখ্যিক ধরনের শূন্য: 0, 0.0, 0j, Decimal(0),Fraction(0, 1)
  • খালি সিকোয়েন্স এবং সংগ্রহগুলি: '', (), [], {}, set(),range(0)

এবং ডেটামোডেল ডকুমেন্টেশন:

object.__bool__(self)

সত্য মান পরীক্ষা এবং বিল্ট-ইন অপারেশন বাস্তবায়নের জন্য আহ্বান bool(); ফিরে আসা উচিত Falseবা True। এই পদ্ধতিটি সংজ্ঞায়িত না __len__()হলে তাকে বলা হয়, এটি সংজ্ঞায়িত হলে এবং অবজেক্টটিকে সত্য হিসাবে বিবেচনা করা হয় যদি এর ফলাফলটি ননজারো হয়। যদি কোনও শ্রেণি বা উভয়কেই সংজ্ঞায়িত করে না __len__() তবে এর __bool__()সমস্ত উদাহরণ সত্য হিসাবে বিবেচিত হবে।

এবং

object.__len__(self)

বিল্ট-ইন ফাংশনটি বাস্তবায়নের জন্য ডেকে আনা হয়েছে len()। অবজেক্টের দৈর্ঘ্য, একটি পূর্ণসংখ্যা = = ০ ফিরিয়ে নেওয়া উচিত, এছাড়াও, এমন একটি বস্তু যা কোনও __bool__()পদ্ধতি সংজ্ঞায়িত করে না এবং যার __len__()পদ্ধতিটি শূন্য ফেরায় তাকে বুলিয়ান প্রসঙ্গে মিথ্যা হিসাবে বিবেচনা করা হয়।

সুতরাং এর পরিবর্তে:

if len(a) == 0:                     # Don't do this!
    print('a is an empty list')

অথবা এটা:

if a == []:                     # Don't do this!
    print('a is an empty list')

এটা কর:

if not a:
    print('a is an empty list')

পাইথোনিক সাধারণত যা সম্পাদন করে তা সম্পাদন করে:

এটি কি পরিশোধ করে? (নোট করুন যে একটি সমমানের অপারেশন করার জন্য কম সময় ভাল হয় :)

>>> import timeit
>>> min(timeit.repeat(lambda: len([]) == 0, repeat=100))
0.13775854044661884
>>> min(timeit.repeat(lambda: [] == [], repeat=100))
0.0984637276455409
>>> min(timeit.repeat(lambda: not [], repeat=100))
0.07878462291455435

স্কেল জন্য, এখানে ফাংশনটি কল করা এবং একটি খালি তালিকা তৈরি এবং ফিরিয়ে দিতে ব্যয় করতে হবে, যা আপনি উপরে ব্যবহৃত শূন্যতার চেকগুলির ব্যয় থেকে বিয়োগ করতে পারেন:

>>> min(timeit.repeat(lambda: [], repeat=100))
0.07074015751817342

আমরা দেখতে পাই যে হয় বিল্টিন ফাংশনটির lenসাথে তুলনা করে দৈর্ঘ্যের জন্য পরীক্ষা করা 0 বা খালি তালিকার বিপরীতে পরীক্ষা করা ডকুমেন্ট হিসাবে ভাষাটির বিল্টিন সিনট্যাক্স ব্যবহার করার চেয়ে অনেক কম পারফর্মেন্ট।

কেন?

জন্য len(a) == 0চেক:

প্রথম পাইথনকে ছায়াছবি কিনা তা দেখতে গ্লোবালগুলি পরীক্ষা করতে হবে len

তারপরে এটি অবশ্যই ফাংশনটি কল করবে, লোড করতে হবে 0এবং পাইথনে সমতা তুলনা করতে হবে (সি এর পরিবর্তে):

>>> import dis
>>> dis.dis(lambda: len([]) == 0)
  1           0 LOAD_GLOBAL              0 (len)
              2 BUILD_LIST               0
              4 CALL_FUNCTION            1
              6 LOAD_CONST               1 (0)
              8 COMPARE_OP               2 (==)
             10 RETURN_VALUE

এবং এর জন্য এটি [] == []একটি অপ্রয়োজনীয় তালিকা তৈরি করতে হবে এবং তারপরে আবার পাইথনের ভার্চুয়াল মেশিনে তুলনামূলক কাজটি করতে হবে (সি এর বিপরীতে)

>>> dis.dis(lambda: [] == [])
  1           0 BUILD_LIST               0
              2 BUILD_LIST               0
              4 COMPARE_OP               2 (==)
              6 RETURN_VALUE

"পাইথোনিক" উপায়টি বস্তুর দৃষ্টান্ত শিরোনামে তালিকার দৈর্ঘ্য ক্যাশে হওয়ায় এটি অনেক সহজ এবং দ্রুত চেক:

>>> dis.dis(lambda: not [])
  1           0 BUILD_LIST               0
              2 UNARY_NOT
              4 RETURN_VALUE

সি উত্স এবং ডকুমেন্টেশন থেকে প্রমাণ

PyVarObject

এটি ক্ষেত্রটি PyObjectযুক্ত করে এটির একটি এক্সটেনশন ob_size। এটি কেবলমাত্র এমন বস্তুর জন্য ব্যবহৃত হয় যার দৈর্ঘ্যের কিছু ধারণা রয়েছে। এই ধরণটি পাইথন / সি এপিআই তে প্রায়শই উপস্থিত হয় না। এটি PyObject_VAR_HEADম্যাক্রোর সম্প্রসারণ দ্বারা সংজ্ঞায়িত ক্ষেত্রগুলির সাথে মিলে যায় ।

অন্তর্ভুক্ত / listobject.h এ সি উত্স থেকে :

typedef struct {
    PyObject_VAR_HEAD
    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size

মন্তব্যে প্রতিক্রিয়া:

আমি নির্দেশ করবে যে এটি সঙ্গে খালি নয় এমন ক্ষেত্রে যদিও তার প্রশংসনীয় কুশ্রী জন্য সত্য l=[]তারপর %timeit len(l) != 090.6 NS ± 8.3 NS, %timeit l != []55.6 NS ± 3.09, %timeit not not l38.5 NS ± 0,372। কিন্তু not not lট্রিপল স্পিড সত্ত্বেও কেউ উপভোগ করতে যাচ্ছে এমন কোনও উপায় নেই । এটি হাস্যকর দেখাচ্ছে। তবে গতিটি জিততে পারে বলে
আমি মনে করি যে সমস্যাটি সময়সীমার সাথে টেস্ট করছে যেহেতু if l:যথেষ্ট যথেষ্ট তবে আশ্চর্যের সাথে %timeit bool(l)101 টি এনএস ± 2.64 এনএস দেয়। আকর্ষণীয় এই জরিমানা ব্যতীত বুল করতে বাধ্য করার কোনও উপায় নেই। %timeit lকোনওরকম রূপান্তর ঘটবে না বলে এটি অকেজো।

আইপিথন যাদু,, %timeitএখানে সম্পূর্ণ অকেজো নয়:

In [1]: l = []                                                                  

In [2]: %timeit l                                                               
20 ns ± 0.155 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

In [3]: %timeit not l                                                           
24.4 ns ± 1.58 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [4]: %timeit not not l                                                       
30.1 ns ± 2.16 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

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

In [5]: %timeit if l: pass                                                      
22.6 ns ± 0.963 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [6]: %timeit if not l: pass                                                  
24.4 ns ± 0.796 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [7]: %timeit if not not l: pass                                              
23.4 ns ± 0.793 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

এখন আসুন বেকারত্বের তালিকার জন্য কেসটি দেখুন:

In [8]: l = [1]                                                                 

In [9]: %timeit if l: pass                                                      
23.7 ns ± 1.06 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [10]: %timeit if not l: pass                                                 
23.6 ns ± 1.64 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [11]: %timeit if not not l: pass                                             
26.3 ns ± 1 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

আমরা এখানে যা দেখতে পাচ্ছি তা হ'ল আপনি boolকন্ডিশন চেক বা তালিকার নিজের তালিকায় প্রকৃতভাবে পাস করেছেন কিনা এবং কিছু যদি তালিকাটি দেওয়া হয় তেমনি দ্রুততর হয় কিনা তাতে কিছুটা পার্থক্য নেই ।

পাইথন সিতে লেখা; এটি সি স্তরে এর যুক্তি ব্যবহার করে। পাইথনে আপনি যা কিছু লিখবেন তা ধীর হবে। এবং আপনি সম্ভবত পাইথনের মধ্যে নির্মিত মেকানিজমগুলি ব্যবহার না করেই সম্ভবত এটি প্রস্থের ধীর গতির আদেশ হতে পারে।


আমি নির্দেশ করবে যে এটি সঙ্গে খালি নয় এমন ক্ষেত্রে যদিও তার প্রশংসনীয় কুশ্রী জন্য সত্য l=[]তারপর %timeit len(l) != 090.6 NS ± 8.3 NS, %timeit l != []55.6 NS ± 3.09, %timeit not not l38.5 NS ± 0,372। কিন্তু not not lট্রিপল স্পিড সত্ত্বেও কেউ উপভোগ করতে যাচ্ছে এমন কোনও উপায় নেই । এটি হাস্যকর দেখাচ্ছে। কিন্তু গতিটি জিতে যায়
গ্রেগরি মোর্স

আমি মনে করি সমস্যাটি সময়সীমার সাথে পরীক্ষা করে চলেছে যেহেতু if l:যথেষ্ট যথেষ্ট তবে আশ্চর্যজনকভাবে %timeit bool(l)101 এনএস ± 2.64 এনএস দেয়। আকর্ষণীয় এই জরিমানা ব্যতীত বুল করতে বাধ্য করার কোনও উপায় নেই। %timeit lকোনওরকম রূপান্তর ঘটবে না বলে এটি অকেজো।
গ্রেগরি মোর্স

138

খালি তালিকা নিজেই সত্য মান পরীক্ষায় মিথ্যা বলে বিবেচিত হয় ( অজগর ডকুমেন্টেশন দেখুন ):

a = []
if a:
     print "not empty"

@ ড্যারেন টমাস

সম্পাদনা: খালি তালিকাটিকে মিথ্যা হিসাবে পরীক্ষা করার বিরুদ্ধে আরেকটি বিষয়: বহুকর্ম সম্পর্কে কী বলা যায়? আপনার তালিকাগুলির উপর নির্ভর করা উচিত নয়। এটি ঠিক হাঁসের মতো ঝাঁকুনি দেওয়া উচিত - আপনি যখন নিজের হাঁস সংগ্রহকে '' ফ্যালস '' কোয়েস্ট করতে যাচ্ছেন তবে এর কোনও উপাদান নেই?

আপনার হাঁসের সংগ্রহটি বাস্তবায়ন করা উচিত __nonzero__বা __len__তাই যদি একটি: সমস্যা ছাড়াই কাজ করবে।


কিভাবে অদ্ভুত [] == Falseমিথ্যাতে যদিও মূল্যায়ন করবে
information_interchange

@ ইনফরমেশন_ইন্টারচেঞ্জ যদি আপনি স্পষ্টভাবে কোনও মানটির সত্যতা পরীক্ষা করতে চান তবে ব্যবহার করুন bool()। প্রত্যাশিত হিসাবে bool([]) == Falseমূল্যায়ন Trueকরবে।
augurar

103

প্যাট্রিকের (গৃহীত) উত্তরটি সঠিক: if not a:এটি করার সঠিক উপায়। হারলে হলকম্বের উত্তরটি সঠিক যে এটি পিইপি 8 স্টাইল গাইডে রয়েছে। তবে উত্তরের কোনটিই ব্যাখ্যা করে না তা হ'ল আইডিয়মটি অনুসরণ করা কেন একটি ভাল ধারণা you এমনকি আপনি ব্যক্তিগতভাবে এটি রুবি ব্যবহারকারীদের বা এটি যাই হোক না কেন যথেষ্ট পরিমাণে বিভ্রান্তিকর হিসাবে খুঁজে পান না find

পাইথন কোড এবং পাইথন সম্প্রদায়ের কাছে খুব শক্ত প্রতিমা রয়েছে। এই আইডিয়োমগুলি অনুসরণ করা পাইথনের অভিজ্ঞ কারও পক্ষে আপনার কোডটি পড়া সহজ করে তোলে। এবং আপনি যখন এই প্রতিমাগুলি লঙ্ঘন করেন, এটি একটি শক্ত সংকেত।

এটি সত্য যে if not a:খালি তালিকাগুলি None, বা সংখ্যা 0, বা খালি টিপলস, বা খালি ব্যবহারকারী-তৈরি সংগ্রহের ধরণগুলি, বা খালি ব্যবহারকারী-তৈরি না-যথেষ্ট-সংগ্রহের ধরণের, বা একক উপাদান নুমপি অ্যারে মিথ্যা দিয়ে স্কেলার হিসাবে অভিনয় করে না মান ইত্যাদি। এবং কখনও কখনও এটি সম্পর্কে স্পষ্ট হওয়া জরুরী। এবং সেক্ষেত্রে আপনি জানেন যে আপনি কী সম্পর্কে স্পষ্ট হতে চান, তাই আপনি ঠিক এটির জন্য পরীক্ষা করতে পারেন। উদাহরণস্বরূপ, এর if not a and a is not None:অর্থ "কিছুই বাদে মিথ্যা কিছু", এর if len(a) != 0:অর্থ "কেবল খালি অনুক্রম — এবং অনুক্রমের বাইরে অন্য কিছু এখানে একটি ত্রুটি" এবং আরও অনেক কিছু। আপনি যা পরীক্ষা করতে চান ঠিক তার জন্য পরীক্ষার পাশাপাশি এটি এই পাঠককেও গুরুত্বপূর্ণ যে এই পরীক্ষাটি গুরুত্বপূর্ণ।

তবে যখন আপনার কাছে স্পষ্ট করার মতো কিছু নেই if not a:, পাঠককে বিভ্রান্ত করছে। আপনি যখন গুরুত্বপূর্ণ কিছু তেমন সংকেত দিচ্ছেন না। (আপনি কোড কম নমনীয় উপার্জন করতে পারে না বা ধীর, অথবা যাই হোক না কেন, কিন্তু যে সব কম গুরুত্বপূর্ণ।) এবং যদি আপনি অভ্যাসগত ভাবেই ভালো পাঠক বিভ্রান্ত, তারপর যখন আপনি কি একটি পার্থক্য করতে প্রয়োজন নেই, এটা অলক্ষিত কারণ পাস যাচ্ছে আপনি আপনার কোড জুড়ে "কান্নার নেকড়ে" ছিলেন।


78

আদৌ চেক করবি কেন?

তালিকার প্রথম স্থানে পরীক্ষা করার প্রয়োজনের বিষয়ে কেউই সম্বোধন করেছেন বলে মনে হয় না। আপনি কোনও অতিরিক্ত প্রসঙ্গ সরবরাহ না করায়, আমি কল্পনা করতে পারি যে আপনাকে প্রথমে এই চেকটি করার দরকার নেই, তবে পাইথনের লিস্ট প্রসেসিংয়ের সাথে অপরিচিত।

আমি তর্ক করব যে সর্বাধিক পাইথোনিক উপায় হ'ল একেবারে পরীক্ষা করা নয়, বরং কেবল তালিকাটি প্রক্রিয়া করা। এইভাবে এটি খালি বা পূর্ণ কিনা সঠিক কাজ করবে।

a = []

for item in a:
    <do something with item>

<rest of code>

এই কোন বিষয়বস্তু হ্যান্ডলিং সুবিধা রয়েছে একটি , যখন শূন্যতা এর জন্য কোনো সুনির্দিষ্ট চেক প্রয়োজন নেই। যদি একটি খালি থাকে, নির্ভরশীল ব্লকটি কার্যকর হবে না এবং অনুবাদকটি পরবর্তী লাইনে যাবে।

আপনার যদি শূন্যতার জন্য অ্যারেটি পরীক্ষা করতে হয় তবে অন্য উত্তরগুলি যথেষ্ট।


3
বিষয়টি হ'ল, তালিকাটি খালি আছে কিনা তা পরীক্ষা করুন, কমপক্ষে আমার জন্য। আপনি কি বিবেচনা করেছেন যদি এমন কোনও স্ক্রিপ্ট রয়েছে <rest of code>যা forলুপ থেকে ফলাফলটি ব্যবহার করতে পারে ? অথবা সরাসরি কিছু মান ব্যবহার করবেন a? আসলে, যদি স্ক্রিপ্টটি কঠোরভাবে নিয়ন্ত্রিত ইনপুট দিয়ে চালিত করার জন্য ডিজাইন করা হয় তবে চেকটি কিছুটা অপ্রয়োজনীয় হতে পারে। তবে বেশিরভাগ ক্ষেত্রে, ইনপুটটি পরিবর্তিত হয় এবং চেক করা সাধারণত ভাল হয়।
অমর্ত গল

শ্রদ্ধার সাথে, না। আমি যেটিকে পাইথন বলেছিলাম যে পাইথন সম্পর্কে যথেষ্ট পরিমাণে জানত না তা জানার জন্য যে "যদি <list>:" সঠিক উত্তর ছিল, খালি তালিকার জন্য কীভাবে চেক করবেন জিজ্ঞাসা করেছিলেন। তারপরে আমি প্রচুর উত্তর লক্ষ্য করেছি যা বিভিন্ন মতামত উপস্থাপন করেছে, তবে কোনওটিই আসল প্রয়োজনীয়তার দিকে নজর দেয়নি। আমি আমার উত্তরটি দিয়ে যা করার চেষ্টা করেছি continuing চালিয়ে যাওয়ার আগে তাদের প্রয়োজনীয়তা পরীক্ষা করতে। আমি বিশ্বাস করি যে আমি আমার উত্তরে যতটা পরামর্শ দিয়েছি, স্পষ্টভাবে বলেছি।
মিঃ ওয়ান্ডারফুল

@ AmarthGûl - কিভাবে এক পারে পেতে থেকে স্ক্রিপ্ট ভিতরে লুপ জন্য <কোডের বিশ্রাম> ফলাফল প্রক্রিয়া করা কিভাবে? একটি তালিকায়, সম্ভবত? না হতে পারে ডিক? যদি তাই হয়, একই যুক্তি প্রয়োগ করা হয়। আমি বুঝতে পারছি না যে পরিবর্তনশীল ইনপুটটি কোনও ধরণের যুক্তিসঙ্গতভাবে ডিজাইন করা কোডের মধ্যে কীভাবে প্রভাব ফেলতে পারে, যেখানে খালি তালিকার প্রক্রিয়াকরণ করা একটি খারাপ ধারণা হবে।
মিঃ ওয়ান্ডারফুল

কিছুটা পুরানো তবে আপনি যদি খালি তালিকাটি খালি ছিল কিনা তা পরীক্ষা করে দেখছিলেন, খালি খালি তালিকার জন্য আপনার ওপি যখন একটি চেক অপারেশন সন্ধান করছে তখন আপনার কোড প্রক্রিয়াটি বার বার পুনরাবৃত্তি করে। এন কোডটি অসীমের কাছে যাওয়ার সাথে সাথে সেই
কোডটির

7
@ ডিজেকে - না, আমার মনে হয় আপনি এখনও এটি মিস করছেন। সম্ভবত আপনি যদি একটি তালিকা দিয়ে কিছু করতে চান। খালি থাকলে আলাদা করে কী করতেন? তাড়াতাড়ি ফিরব? খালি না হলে কী হবে? এটি প্রক্রিয়া? মুল বক্তব্যটি হ'ল, এখনও, আপনাকে সম্ভবত খালি তালিকার জন্য পরীক্ষা করার দরকার নেই, কেবল এটির উপরে পুনরাবৃত্তি করুন এবং আপনি উপাদানগুলির সাথে যা যা করতে যাচ্ছেন তাই করুন। যদি কোনও উপাদান না থাকে তবে আপনি এর মধ্যে পড়ে যান। যদি উপাদানগুলি থাকে, আপনি তাদের যেমন প্রয়োজন তেমন প্রক্রিয়া করুন। বিন্দুটি খালি চেকের জন্য উদাহরণটি ব্যবহার না করে বরং একেবারে যাচাই না করে কেবল তালিকাটি প্রক্রিয়া করুন।
মিঃ ওয়ান্ডারফুল

66

len()পাইথন তালিকাগুলি, স্ট্রিং, ডিক্টস এবং সেটগুলির জন্য ও (1) অপারেশন । পাইথন অভ্যন্তরীণভাবে এই ধারকগুলির উপাদানগুলির সংখ্যা ট্র্যাক করে।

জাভাস্ক্রিপ্টে সত্যবাদী / মিথ্যা ধারণাটির অনুরূপ ধারণা রয়েছে


40

আমি লিখেছিলাম:

if isinstance(a, (list, some, other, types, i, accept)) and not a:
    do_stuff

যা ভোট হয়েছিল -১। আমি নিশ্চিত না কারণ এটি কারণ কারণ পাঠকরা কৌশলটির বিরুদ্ধে আপত্তি করেছিলেন বা ভেবেছিলেন যে উত্তরটি উপস্থাপিত হিসাবে সহায়ক ছিল না। আমি ভান করব এটি পরে, কারণ --- যাইহোক "পাইথোনিক" হিসাবে গণ্য --- এটি সঠিক কৌশল। আপনি যদি ইতিমধ্যে বাতিল না হয়ে থাকেন বা aউদাহরণস্বরূপ যেখানে মামলাগুলি পরিচালনা করতে প্রস্তুত না হন তবে Falseআপনার বিচারের চেয়ে বিচারের চেয়ে আরও বেশি নিয়ন্ত্রণমূলক প্রয়োজন if not a:। আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

if isinstance(a, numpy.ndarray) and not a.size:
    do_stuff
elif isinstance(a, collections.Sized) and not a:
    do_stuff

প্রথম পরীক্ষাটি উপরের @ মাইক এর উত্তরের প্রতিক্রিয়াতে। তৃতীয় লাইনটি এর সাথে প্রতিস্থাপন করা যেতে পারে:

elif isinstance(a, (list, tuple)) and not a:

আপনি যদি কেবলমাত্র নির্দিষ্ট প্রকারের (এবং তাদের উপপ্রকার) উদাহরণগুলি গ্রহণ করতে চান বা এর সাথে:

elif isinstance(a, (list, tuple)) and not len(a):

আপনি সুস্পষ্ট ধরণের চেক ব্যতীত পালাতে পারবেন, তবে পার্শ্ববর্তী প্রসঙ্গ যদি ইতিমধ্যে আপনাকে আশ্বাস দেয় যে আপনি যে aধরণের হ্যান্ডেল করার জন্য প্রস্তুত তা ধরণের একটি মূল্য, বা আপনি যদি নিশ্চিত হন যে আপনি যে ধরণের হ্যান্ডেল করার জন্য প্রস্তুত নন তারা চলেছে ত্রুটি বাড়াতে (উদাহরণস্বরূপ, TypeErrorযদি আপনি lenকোনও মানটির জন্য কল করেন যার জন্য এটি অপরিজ্ঞাত) আপনি হ্যান্ডেল করার জন্য প্রস্তুত prepared সাধারণভাবে, "পাইথোনিক" সম্মেলনগুলি এই শেষ পথে চলেছে বলে মনে হয়। এটিকে হাঁসের মতো চেপে ধরুন এবং কীভাবে কীভাবে কোচিং করা যায় তা যদি তা না জানেন তবে এটি একটি ডাকআরার বাড়িয়ে দিন। আপনার এখনও আছে কী ধরণের অনুমান করছেন তা চিন্তা করতে হবে এবং আপনি যে মামলাগুলি সঠিকভাবে পরিচালনা করার জন্য প্রস্তুত নন সেগুলি সঠিক জায়গায় ত্রুটি হয়ে চলেছে কিনা। নম্পি অ্যারে একটি ভাল উদাহরণ যেখানে কেবল অন্ধভাবে নির্ভর করেlen বা বুলিয়ান টাইপাস্টাস্ট আপনার প্রত্যাশাটি ঠিক তা না করতে পারে।


3
এটি অত্যন্ত বিরল যে আপনার কাছে types প্রকারের একটি সম্পূর্ণ তালিকা রয়েছে যা আপনি গ্রহণ করতে চান এবং অন্য কোনও ধরণের জন্য নমনীয় নন। আপনার যখন এই ধরণের জিনিস প্রয়োজন হয়, আপনি সম্ভবত একটি এবিসি চান। এক্ষেত্রে এটি সম্ভবত স্ট্যান্ডলিব এবিসিগুলির মধ্যে একটি হতে পারে , পছন্দ collections.abc.Sizedবা collections.abc.Sequenceতবে তবে এটি আপনি নিজের লিখতে এবং লিখতে পারেন register(list)। যদি আপনার কাছে এমন কোড থাকে যেখানে অন্যান্য মিথ্যা থেকে খালি আলাদা করা এবং অন্য তালিকাগুলি থেকে তালিকাগুলি এবং টিপলগুলি আলাদা করা গুরুত্বপূর্ণ, তবে এটি সঠিক — তবে আমি বিশ্বাস করি না যে আপনার কাছে এই জাতীয় কোড রয়েছে।
abarnert

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

1
আপনি যদি সত্যিই যাচাই করতে চান যে মানটি হ'ল []এবং অন্য ধরণের মিথ্যা কিছু নয় তবে অবশ্যই if a == []:আইসনস্ট্যান্সের সাথে ব্যঙ্গ করার চেয়ে বরং তাকে ডাকা হবে।
রিমকো জারলিচ

2
==যদিও এর জন্য কিছু স্বয়ংক্রিয় জবরদস্তি রয়েছে । আমার মাথার উপরের অংশটি, আমি কোনওটির জন্য সনাক্ত করতে পারি না [][] == ()উদাহরণস্বরূপ রিটার্ন False। তবে উদাহরণস্বরূপ frozenset()==set()রিটার্ন True। সুতরাং এটি করার সময় কিছুটা অনাকাঙ্ক্ষিত প্রকারের [](বা বিপরীতে) জোর করা যেতে পারে কিনা তা নিয়ে অন্তত কিছুটা চিন্তাভাবনা করা মূল্যবান a == []
সন্দেহজনক জিম

@ রেমকো গ্রিলিচ - ইসিনস্ট্যান্স () এখনও তুলনামূলকভাবে খালি তালিকা তৈরির বিরোধী হিসাবে ততই পছন্দনীয়। এছাড়াও, অন্যটি নির্দেশিত হিসাবে, সাম্যতা অপারেটর কিছু প্রকারের অন্তর্নিহিত রূপান্তর করতে পারে, যা অনাকাঙ্ক্ষিত হতে পারে। "এ == []" কোড করার কোনও কারণ নেই এবং সেই কোডটি অবশ্যই আমি অংশ নিয়েছি এমন কোনও কোড পর্যালোচনায় একটি ত্রুটি হিসাবে চিহ্নিত করা হবে। ভাষার দ্বারা প্রদত্ত উপযুক্ত সরঞ্জামটি ব্যবহার করা "মিকিং" হিসাবে বিবেচিত হবে না , "বরং" ভাল প্রোগ্রামিং কৌশল।
মিঃ ওয়ান্ডারফুল

29

সত্য মান পরীক্ষার উপর ডকুমেন্টেশন থেকে :

এখানে তালিকাভুক্ত যা ব্যতীত সমস্ত মান বিবেচিত হয় True

  • None
  • False
  • কোনো সাংখ্যিক ধরনের শূন্য, উদাহরণস্বরূপ, 0, 0.0, 0j
  • কোন খালি ক্রম, উদাহরণস্বরূপ, '', (), []
  • কোনও খালি ম্যাপিং, উদাহরণস্বরূপ {},।
  • ব্যবহারকারী-সংজ্ঞায়িত শ্রেণীর উদাহরণ, যদি শ্রেণিটি একটি __bool__()বা __len__()পদ্ধতি নির্ধারণ করে , যখন সেই পদ্ধতিটি পূর্ণসংখ্যা শূন্য বা বুল মান দেয় False

দেখা যায়, খালি তালিকা []হয় falsy , করছেন কি একটি বুলিয়ান মান শব্দসমূহ সবচেয়ে বেশি কার্যকরী করা হবে তাই হয়:

if not a:
    print('"a" is empty!')

@ ডিজে_এসটিফি_ কে ইউনিট টেস্টিংয়ে খালি তালিকাতে কি জোড় করে বলছেন? শুধু ব্যবহার assert(not myList)। আপনি যদি অবজেক্টটি হ'ল এটির অবস্থান নির্ধারণ করতে চান তবে আপনি এটি listব্যবহার করতে পারেন assertIsInstance()
Sнаđошƒаӽ

24

তালিকা খালি কিনা তা এখানে কয়েকটি উপায় যাচাই করতে পারেন:

a = [] #the list

1) খুব সহজ অজগর উপায়:

if not a:
    print("a is empty")

পাইথনে খালি পাত্রে যেমন তালিকা, টিপলস, সেট, ডিক্টস, ভেরিয়েবল ইত্যাদি হিসাবে দেখা হয় False। একজন কেবল তালিকাকে একটি শিকার হিসাবে বিবেচনা করতে পারে ( একটি বুলিয়ান মান ফেরত )। এবং একটি Trueমান ইঙ্গিত করবে যে এটি খালি নয়।

2) একটি সুস্পষ্ট উপায়: len()দৈর্ঘ্যটি সন্ধান করতে এবং এটির সাথে সমান কিনা তা পরীক্ষা করে দেখুন 0:

if len(a) == 0:
    print("a is empty")

3) বা এটি কোনও বেনামে ফাঁকা তালিকার সাথে তুলনা করুন:

if a == []:
    print("a is empty")

4) অন্য আর একটি নিখুঁত উপায় হ'ল ব্যবহার exceptionএবং iter():

try:
    next(iter(a))
    # list has elements
except StopIteration:
    print("Error: a is empty")

20

আমি নিম্নলিখিত পছন্দ:

if a == []:
   print "The list is empty."

37
আপনি অকারণে অতিরিক্ত খালি তালিকা ইনস্ট্যান্ট করার সাথে সাথে এটি ধীর হতে চলেছে।
কার্ল মায়ার

32
এটি এর চেয়ে কম পঠনযোগ্য if not a:এবং আরও সহজে ব্রেক হয়ে যায়। দয়া করে এটি করবেন না।
devsnd

আগে তৈরি একটি ভাল পয়েন্টটিও () == []মিথ্যা সমান। যদিও আমি পছন্দ করি যে এই বাস্তবায়নটি if not a:সমস্ত ক্ষেত্রে কভারগুলি কীভাবে পড়ে তা যদি আপনি অবশ্যই একটি তালিকা আশা করেন তবে আপনার উদাহরণটি যথেষ্ট sufficient
2013 এ স্টার

19

পদ্ধতি 1 (পছন্দসই):

if not a : 
   print ("Empty") 

পদ্ধতি 2:

if len(a) == 0 :
   print( "Empty" )

পদ্ধতি 3:

if a == [] :
  print ("Empty")

12
def list_test (L):
    if   L is None  : print('list is None')
    elif not L      : print('list is empty')
    else: print('list has %d elements' % len(L))

list_test(None)
list_test([])
list_test([1,2,3])

কখনও কখনও Noneপৃথকভাবে শূন্যতার জন্য পরীক্ষা করা ভাল কারণ এগুলি দুটি ভিন্ন রাষ্ট্র। উপরের কোডটি নিম্নলিখিত আউটপুট উত্পাদন করে:

list is None 
list is empty 
list has 3 elements

যদিও এটি Noneমিথ্যা কিছু মূল্য নেই । সুতরাং আপনি যদি পরীক্ষা-নিরীক্ষার জন্য পৃথক করতে না চান None, আপনাকে এটি করতে হবে না।

def list_test2 (L):
    if not L      : print('list is empty')
    else: print('list has %d elements' % len(L))

list_test2(None)
list_test2([])
list_test2([1,2,3])

প্রত্যাশিত উত্পাদন

list is empty
list is empty
list has 3 elements

8

অনেক উত্তর দেওয়া হয়েছে, এবং তাদের অনেকগুলি বেশ ভাল। আমি ঠিক যে চেক যোগ করতে চেয়েছিলেন

not a

Noneখালি কাঠামোর জন্য এবং অন্যান্য ধরণের জন্যও পাস করবে । আপনি যদি সত্যিই খালি তালিকার জন্য চেক করতে চান তবে আপনি এটি করতে পারেন:

if isinstance(a, list) and len(a)==0:
    print("Received an empty list")

এটি সম্ভব নয় এটি একটি ব্যতিক্রম ছোঁড়ে, যদি aএটি তালিকা না থাকে এবং aকোনও পদ্ধতি __len__প্রয়োগ করা হয় না। আমি সুপারিশ করব:if isinstance(obj, list): if len(obj) == 0: print '...'
সোভেন ক্রুগার

4
@ SvenKrüger নাপ andপাইথনে অপারেটর অলস। andশর্তটি andমিথ্যা হলে এর পরে আর কিছুই কার্যকর করা হবে না ।
এলমোভ্যানকিয়েলমো

7

আমরা অন্য একটি সহজ ব্যবহার করতে পারে:

item_list=[]
if len(item_list) == 0:
    print("list is empty")
else:
    print("list is not empty")

5
-1 - বিভ্রান্তি এড়াতে, পরিবর্তনশীল নামের জন্য কোনও সংরক্ষিত শব্দ ব্যবহার করবেন না বা পরের বার আপনি কল করার চেষ্টা করার সময় আপনি আশ্চর্যজনক আচরণ পেতে পারেন, উদাহরণস্বরূপ "তালিকা ()" ... "টাইপ এরিয়ার: 'তালিকা' অবজেক্টের মতো কিছু কলযোগ্য নয় "বা এই জাতীয় কিছু।
মিঃ ওয়ান্ডারফুল

6

আপনি যদি কোনও তালিকা খালি রাখেন কিনা তা পরীক্ষা করতে চান:

l = []
if l:
    # do your stuff.

আপনি যদি তালিকার সমস্ত মান খালি কিনা তা পরীক্ষা করতে চান। তবে এটি Trueখালি তালিকার জন্য হবে :

l = ["", False, 0, '', [], {}, ()]
if all(bool(x) for x in l):
    # do your stuff.

আপনি উভয় ক্ষেত্রে একসাথে ব্যবহার করতে চাইলে:

def empty_list(lst):
    if len(lst) == 0:
        return False
    else:
        return all(bool(x) for x in l)

এখন আপনি ব্যবহার করতে পারেন:

if empty_list(lst):
    # do your stuff.

1
সমস্ত (বুল (এক্স) এক্স এর জন্য x) খালি তালিকার জন্য সত্য
গ্যাবার্গার

5

@ সন্দেহভাজনজিমের সমাধান দ্বারা অনুপ্রাণিত হয়ে, আমি এটির পুনরাবৃত্তিযোগ্য কিছু কিনা এর অতিরিক্ত সাধারণ চেক ব্যবহার করার প্রস্তাব করছি

import collections
def is_empty(a):
    return not a and isinstance(a, collections.Iterable)

দ্রষ্টব্য: একটি স্ট্রিংকে পুনরাবৃত্তিযোগ্য বলে মনে করা হয়। - and not isinstance(a,(str,unicode))আপনি যদি খালি স্ট্রিংটি বাদ দিতে চান তবে যুক্ত করুন

টেস্ট:

>>> is_empty('sss')
False
>>> is_empty(555)
False
>>> is_empty(0)
False
>>> is_empty('')
True
>>> is_empty([3])
False
>>> is_empty([])
True
>>> is_empty({})
True
>>> is_empty(())
True

1
Overbroad; এটি কেবল একটি তালিকা খালি কিনা তা জিজ্ঞাসা করছে, কিছু খালি পুনরাবৃত্তিযোগ্য কিনা।
পিপ্পারি

1
আমি যদি এতে সন্তুষ্ট না থাকতাম তবে if a:এটি এমন হত কারণ আমি কোনও ব্যতিক্রমী aধারক না হলে ব্যতিক্রম চাইতাম । ( পুনরাবৃত্তিযোগ্য হওয়ার কারণে পুনরাবৃত্তিরও অনুমতি দেওয়া হয়, যা শূন্যতার জন্য কার্যকরভাবে পরীক্ষা করা যায় না))
ডেভিস হেরিং


4

পাইথন 3 থেকে আপনি ব্যবহার করতে পারেন

a == []

তালিকাটি খালি আছে কিনা তা পরীক্ষা করতে

সম্পাদনা: এটি পাইথন 2.7 এর সাথেও কাজ করে ..

এত জটিল উত্তর কেন আছে তা আমি নিশ্চিত নই। এটি বেশ পরিষ্কার এবং সোজা


1
"যদি" না লিখে এটি কীভাবে কাজ করছে সে সম্পর্কে আরও ব্যাখ্যা দিন?
গণেশদেশমুখ

3
এটি পাইথোনিক বা সম্পূর্ণ উদাহরণ নয়। এছাড়াও, এটি প্রতিবার মুখোমুখি হওয়ার সাথে সাথে একটি খালি তালিকা ইনস্ট্যান্ট করে। এটি করবেন না।
মিঃ ওয়ান্ডারফুল

@ মিঃ ওয়ান্ডারফুল এটি প্রতিবার খালি তালিকা ইনস্ট্যান্ট করে না। বিদ্যমান তালিকাটি aখালি আছে কিনা তা কেবল এটি যাচাই করে ।
টেসারাক্টার

@ মিঃ ওয়ান্ডারফুল আমি যা তৈরি করে তা পাই নাpythonic
টেসারাকটার

@ বাগেশদেশেশমুখ আপনি যদি a==[]এটি ব্যবহার করেন তবে এটি খালি থাকলে পাইথন টার্মিনালে সত্য মুদ্রিত হবে। অন্যথায় এটি মিথ্যা মুদ্রণ করবে। আপনি এটি যদি কোনও শর্তের মধ্যেও ব্যবহার করতে পারেনif(a==[])
টেসারাকটার

3

আপনি বুল () এর মতো ব্যবহার করে দেখতেও পারেন

    a = [1,2,3];
    print bool(a); # it will return True
    a = [];
    print bool(a); # it will return False

আমি চেক তালিকার জন্য এই ভাবে পছন্দ করি ফাঁকা বা না।

খুব সহজ এবং দরকারী।


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

এটি একটি অভিব্যক্তিতে ব্যবহারযোগ্য এবং আরও পরিশ্রুত।
qneill

3

কেবল is_empty () ব্যবহার করুন বা এর মতো ফাংশন তৈরি করুন: -

def is_empty(any_structure):
    if any_structure:
        print('Structure is not empty.')
        return True
    else:
        print('Structure is empty.')
        return False  

এটি কোনও ডাটা_ স্ট্রাকচারের জন্য তালিকার মতো, টিপলস, অভিধান এবং আরও অনেক কিছুর জন্য ব্যবহার করা যেতে পারে। এগুলি দ্বারা, আপনি ন্যায়বিচারটি ব্যবহার করে এটি বহুবার কল করতে পারেন is_empty(any_structure)


3
নামটি is_emptyপ্রস্তাব দেয় যে এটি কিছু দেয়। তবে যদি এটি হয়ে থাকে তবে এটি কিছু হবে bool(any_structure), যা আপনার পরিবর্তে ব্যবহার করা উচিত ( যখন আপনার যখন একেবারেই প্রয়োজন boolহয়)।
ডেভিস হেরিং

4
আমরা কেন boolস্ট্যান্ডার্ড আউটপুটে মেসেজ প্রিন্ট করে (তার মধ্যে) তারতম্য চাই ?
ডেভিস হ্যারিং

@ ডেভিস হেরিং আমাদের সর্বদা দুটি পছন্দ থাকে প্রথমে ফাংশনটি ব্যবহার করে মুদ্রণ করা অন্যটি রিটার্ন boolভেরিয়েবল ব্যবহার করে । সিদ্ধান্ত তোমার. আমি উভয়ই লিখি যাতে আপনি তাদের মধ্যে বেছে নিতে পারেন।
বিনীত জৈন


1

একটি খালি তালিকার সত্য মানটি Falseযখন খালি শূন্য তালিকার জন্য থাকে True


1

যা আমাকে এখানে এনেছে তা একটি বিশেষ ব্যবহারের ক্ষেত্র: আমি আসলে কোনও ফাংশন চেয়েছিলাম আমাকে কোনও তালিকা ফাঁকা আছে কিনা তা বলার জন্য। আমি এখানে আমার নিজস্ব ফাংশন লিখতে বা ল্যাম্বডা-এক্সপ্রেশনটি ব্যবহার এড়াতে চেয়েছিলাম (কারণ মনে হয়েছিল এটি যথেষ্ট সহজ হওয়া উচিত):

foo = itertools.takewhile(is_not_empty, (f(x) for x in itertools.count(1)))

এবং, অবশ্যই এটি করার খুব স্বাভাবিক উপায় রয়েছে:

foo = itertools.takewhile(bool, (f(x) for x in itertools.count(1)))

অবশ্যই এটি (যেমন ) ব্যবহার করবেন না কারণ এটি নিহিত রয়েছে। তবে, ক্ষেত্রেগুলির জন্য যখন "খালি নয়" স্পষ্টভাবে একটি ফাংশন হিসাবে প্রয়োজন হয়, সর্বোত্তম পছন্দ।boolifif bool(L):bool


1

কোনও তালিকা খালি আছে কিনা তা যাচাই করতে আপনি নিম্নলিখিত দুটি উপায় ব্যবহার করতে পারেন। তবে মনে রাখবেন, আমাদের এক ধরণের ক্রম (এটি একটি less pythonicউপায়) জন্য স্পষ্টভাবে চেক করার উপায়টি এড়ানো উচিত :

def enquiry(list1): 
    if len(list1) == 0: 
        return 0
    else: 
        return 1

# ––––––––––––––––––––––––––––––––

list1 = [] 

if enquiry(list1): 
    print ("The list isn't empty") 
else: 
    print("The list is Empty") 

# Result: "The list is Empty".

দ্বিতীয় উপায় একটি more pythonicএক। এই পদ্ধতিটি চেক করার একটি অন্তর্নিহিত উপায় এবং আগেরটির চেয়ে অনেক বেশি পছন্দনীয়।

def enquiry(list1): 
    if not list1: 
        return True
    else: 
        return False

# ––––––––––––––––––––––––––––––––

list1 = [] 

if enquiry(list1): 
    print ("The list is Empty") 
else: 
    print ("The list isn't empty") 

# Result: "The list is Empty"

আশাকরি এটা সাহায্য করবে.

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