পাইথন তালিকার মধ্যে সত্যিকারের বুলিয়ানগুলির সংখ্যা গণনা করা হচ্ছে


152

আমার কাছে বুলিয়ানদের একটি তালিকা রয়েছে:

[True, True, False, False, False, True]

এবং আমি তালিকার সংখ্যা গণনা করার একটি উপায় খুঁজছি True(সুতরাং উপরের উদাহরণে, আমি ফিরে আসতে চাই want 3) আমি নির্দিষ্ট উপাদানগুলির সংখ্যার সন্ধানের উদাহরণ পেয়েছি, তবে আরও কিছু আছে কি? আমি বুলিয়ানদের সাথে কাজ করার পর থেকে এটি করার কার্যকর উপায়? আমি কিছু অনুরূপ চিন্তা করছি allবা any


আপনি যদি কেবল স্মরণিকা ব্যবহার করে হার্ডওয়্যারে কীভাবে বিট কাউন্টিং করেছিলেন তা যদি মনে হয়।
ভ্লাদিস্লাভস ডভগ্যালিক্স

উত্তর:


207

Trueসমান 1

>>> sum([True, True, False, False, False, True])
3

23
এটি মূর্খবাদী নয় এবং বুলের জবরদস্তির "অপব্যবহার" করে।
জান সেগ্রে

24
@ জন সেগ্রে, কোনও জবরদস্তি নেই, বুল একটি পূর্ণসংখ্যার প্রকার।
পান্ডা -34

25
@ পান্ডা -৪৪, আমি যাচাই করেছি এবং issubclass(bool, int)বাস্তবে ধরে রেখেছি , তাই কোনও জবরদস্তি নেই।
জান সেগ্রে

152

listএকটি countপদ্ধতি আছে:

>>> [True,True,False].count(True)
2

এটি প্রকৃতপক্ষে আরও কার্যকর sumএবং সেইসাথে অভিপ্রায় সম্পর্কে আরও সুস্পষ্ট হওয়ার কারণে এটি ব্যবহার করার কোনও কারণ নেই sum:

In [1]: import random

In [2]: x = [random.choice([True, False]) for i in range(100)]

In [3]: %timeit x.count(True)
970 ns ± 41.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [4]: %timeit sum(x)
1.72 µs ± 161 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

2
0 মানও থাকলে আমি ভুয়া মান গণনা করতে পারি না
কোস্টানোস

10
আপনার sumযদি 1 বা সত্যের বাইরে অন্য "সত্য" মান থাকে তবে আপনি অন্য উত্তরটি ব্যবহার করতে পারবেন না । তদ্ব্যতীত, তবে প্রশ্নে Trueবা ছাড়া কিছুই উল্লেখ করা হয়নি False
মার্ক টোলোনেন

43

আপনি যদি কেবল ধ্রুবকের সাথে সম্পর্কিত হন তবে Trueএকটি সরল sumসূক্ষ্ম। তবে, মনে রাখবেন পাইথনে অন্যান্য মানগুলিও মূল্যায়ন করে True। আরও শক্তিশালী সমাধান boolহ'ল বিল্টিন ব্যবহার করা :

>>> l = [1, 2, True, False]
>>> sum(bool(x) for x in l)
3

আপডেট: এখানে আরও অনুরূপ শক্তিশালী সমাধান যা আরও স্বচ্ছ হওয়ার সুবিধা রয়েছে:

>>> sum(1 for x in l if x)
3

পিএস পাইথন ট্রিভিয়া: 1 না হয়েই সত্য True হতে পারে ning সতর্কতা: কাজের জায়গায় এটি চেষ্টা করবেন না!

>>> True = 2
>>> if True: print('true')
... 
true
>>> l = [True, True, False, True]
>>> sum(l)
6
>>> sum(bool(x) for x in l)
3
>>> sum(1 for x in l if x)
3

আরও বেশি মন্দ:

True = False

ঠিক আছে, আমি আপনার উদাহরণটি দেখতে পাচ্ছি এবং আমি এটি দেখতে পাচ্ছি। এর LOL-ness ব্যতীত, আপনি এখানে যা দেখিয়েছেন তা করার আসলেই কি কোনও ভাল কারণ আছে?
এসি

1
হ্যাঁ, শীর্ষ অংশের জন্য। যেমন আমি ইঙ্গিত করেছি, সত্য "পরীক্ষা" করার চেয়ে পাইথন পরীক্ষা "সত্য" (যেমন একটি ifবিবৃতিতে) হিসাবে আরও জটিল TrueDocs.python.org/py3k/library/stdtyype.html#truth দেখুন । কেবল True = 2এটিই আরও জোরদার করার জন্য যে "সত্য" এর ধারণাটি আরও জটিল; কিছুটা অতিরিক্ত কোড (অর্থাত্‍ ব্যবহার করে bool()) দিয়ে আপনি সমাধানটিকে আরও দৃ .় এবং আরও সাধারণ করতে পারেন।
নেড ডিলি

9
পাইথন 3 এ, Trueএবং Falseকীওয়ার্ড রয়েছে এবং আপনি এগুলি পরিবর্তন করতে পারবেন না।
দ্য পিয়ার্সিংপ্রিন্স


5

কেবল সম্পূর্ণতার জন্য ( sumসাধারণত পছন্দনীয়), আমি উল্লেখ করতে চেয়েছিলাম যে আমরা filterসত্যবাদী মূল্যবোধগুলি পেতেও ব্যবহার করতে পারি। সাধারণ ক্ষেত্রে, filterপ্রথম তর্ক হিসাবে কোনও ফাংশন গ্রহণ করে তবে আপনি যদি Noneএটিটি পাস করেন তবে এটি সমস্ত "সত্যবাদী" মানগুলির জন্য ফিল্টার করবে। এই বৈশিষ্ট্যটি কিছুটা অবাক করার মতো, তবে এটি নথিবদ্ধ এবং পাইথন 2 এবং 3 উভয় ক্ষেত্রেই কাজ করে।

সংস্করণগুলির মধ্যে পার্থক্যটি হ'ল পাইথন 2 এ filterএকটি তালিকা ফিরে আসে, তাই আমরা ব্যবহার করতে পারি len:

>>> bool_list = [True, True, False, False, False, True]
>>> filter(None, bool_list)
[True, True, True]
>>> len(filter(None, bool_list))
3

তবে পাইথন 3-এ, filterএকটি পুনরাবৃত্তিকে ফেরত দেয়, তাই আমরা ব্যবহার করতে পারি না lenএবং যদি আমরা sumকোনও কারণ ব্যবহার (এ কারণেই) এড়াতে চাই তবে পুনরুক্তিটিকে একটি তালিকায় রূপান্তর করা উচিত (এটি এটিকে আরও কম সুন্দর করে তোলে):

>>> bool_list = [True, True, False, False, False, True]
>>> filter(None, bool_list)
<builtins.filter at 0x7f64feba5710>
>>> list(filter(None, bool_list))
[True, True, True]
>>> len(list(filter(None, bool_list)))
3

4

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

আমি 50,000 এলোমেলো বুলেটিন উত্পন্ন করেছি sumএবং countতাদের কল করেছিলাম।

আমার ফলাফলগুলি এখানে:

>>> a = [bool(random.getrandbits(1)) for x in range(50000)]
>>> len(a)
50000
>>> a.count(False)
24884
>>> a.count(True)
25116
>>> def count_it(a):
...   curr = time.time()
...   counting = a.count(True)
...   print("Count it = " + str(time.time() - curr))
...   return counting
... 
>>> def sum_it(a):
...   curr = time.time()
...   counting = sum(a)
...   print("Sum it = " + str(time.time() - curr))
...   return counting
... 
>>> count_it(a)
Count it = 0.00121307373046875
25015
>>> sum_it(a)
Sum it = 0.004102230072021484
25015

নিশ্চিতভাবেই, আমি এটি আরও বেশ কয়েকবার পুনরাবৃত্তি করেছি:

>>> count_it(a)
Count it = 0.0013530254364013672
25015
>>> count_it(a)
Count it = 0.0014507770538330078
25015
>>> count_it(a)
Count it = 0.0013344287872314453
25015
>>> sum_it(a)
Sum it = 0.003480195999145508
25015
>>> sum_it(a)
Sum it = 0.0035257339477539062
25015
>>> sum_it(a)
Sum it = 0.003350496292114258
25015
>>> sum_it(a)
Sum it = 0.003744363784790039
25015

এবং আপনি দেখতে পাচ্ছেন, এর countচেয়ে 3 গুণ বেশি দ্রুত sum। সুতরাং আমি countযেমন করেছি তেমন ব্যবহার করার পরামর্শ দেব count_it

পাইথন সংস্করণ: 3.6.7
সিপিইউ কোর: 4
র‌্যাম সাইজ: 16 জিবি
ওএস: উবুন্টু 18.04.1 এলটিএস


3

এটি boolপ্রথম মাধ্যমে চালানো নিরাপদ । এটি সহজেই করা হয়:

>>> sum(map(bool,[True, True, False, False, False, True]))
3

তারপরে পাইথন যথাযথ বালতিতে সত্য বা মিথ্যা বলে বিবেচনা করে এমন সমস্ত কিছুই আপনি পাবেন:

>>> allTrue=[True, not False, True+1,'0', ' ', 1, [0], {0:0}, set([0])]
>>> list(map(bool,allTrue))
[True, True, True, True, True, True, True, True, True]

আপনি যদি পছন্দ করেন তবে আপনি একটি উপলব্ধি ব্যবহার করতে পারেন:

>>> allFalse=['',[],{},False,0,set(),(), not True, True-1]
>>> [bool(i) for i in allFalse]
[False, False, False, False, False, False, False, False, False]

1

আমি পছন্দ করি len([b for b in boollist if b is True])(বা জেনারেটর-এক্সপ্রেশন সমতুল্য), কারণ এটি বেশ স্ব-ব্যাখ্যামূলক। Ignacio Vazquez-Abram দ্বারা প্রস্তাবিত উত্তরের চেয়ে কম 'ম্যাজিকাল'।

বিকল্পভাবে, আপনি এটি করতে পারেন, যা এখনও ধরে নেয় যে বুলটি ইনটে রূপান্তরযোগ্য তবে সত্যের মান সম্পর্কে কোনও অনুমান করে না: ntrue = sum(boollist) / int(True)


আপনার সমাধানটিতে কমপক্ষে দুটি সমস্যা রয়েছে। এক, এটি একই দৃust়তা ইস্যুতে ভুগছে; আপনি কেবল পরীক্ষায় পরিবর্তন করে এটি ঠিক করতে পারেন if b। তবে, আরও গুরুত্বপূর্ণ, আপনি একটি নিক্ষেপ তালিকা তৈরি করছেন যা সমস্ত মান একবারে মেমরির প্রয়োজন এবং আপনি lenকোনও জেনারেটর এক্সপ্রেশন দিয়ে ব্যবহার করতে পারবেন না । এই জাতীয় অনুশীলনগুলি এড়ানো ভাল যাতে সমাধানটি স্কেল করতে পারে।
নেড ডিলি

@ নেড ডিলি: if bএকেবারে ভুল। এটি শুধুমাত্র তখনই সঠিক হবে যদি প্রশ্নটি সত্যিকারের সত্যিকারের বুলেটিনের পরিবর্তে সত্য হিসাবে মূল্যায়নকারী আইটেমগুলির বিষয়ে হয়। আমি যদিও আপনার দ্বিতীয় পয়েন্ট নিতে। সেক্ষেত্রে ভেরিয়েন্ট আছে sum(1 if b is True else 0 for b in boollist)
কাম্পু

আমি অন্য কোথাও উল্লেখ করেছি, প্রশ্নটি থেকে আমার কাছে স্পষ্ট হয় না যে ওপি'র অর্থ হ'ল কেবল 1 টি মান দিয়ে টাইপ বুলের অবজেক্টগুলি গণনা করা বা সত্যকে মূল্যায়নের মানগুলির বৃহত্তর এবং সাধারণভাবে আরও কার্যকর সেটগুলির অর্থ। যদি প্রাক্তন হয়, তবে একটি পরিচয় পরীক্ষা সঠিক পদ্ধতির তবে এটি সীমিতও। টাইপ বুলের অবজেক্টগুলি পাইথনের পরিবর্তে অদ্ভুত হাঁস, ভাষার তুলনায় সাম্প্রতিকতম সংযোজন। যাই হোক না কেন আমি সহজ জন্য যেতে চাই:sum(1 for b in boollist if b is True)
নেড ডিলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.