পাইথনে 'মিথ্যা' কে 0 এবং 'সত্য' কে 1 তে রূপান্তর করা যায়


118

একটি উপায় আছে রূপান্তর করতে হয় trueধরনের unicode1 এবং falseটাইপ unicode(পাইথন মধ্যে) 0 কিভাবে?

উদাহরণ স্বরূপ: x == 'true' and type(x) == unicode

আমি চাই x = 1

PS: আমি ব্যবহার করতে চাই না if- else

উত্তর:


164

int()বুলিয়ান পরীক্ষায় ব্যবহার করুন:

x = int(x == 'true')

int()বুলেয়ানকে 1বা তে পরিণত করে 0। নোট করুন যে কোনও মান সমান নয়'true' তার ফলস্বরূপ হবে 0


এটি একটি দুর্দান্ত উত্তর ব্যতীত সমস্ত কিছু 'সত্য' সংখ্যায় '0' হিসাবে ব্যাখ্যা করা হবে। এটি ওপিএস প্রয়োজনীয়তার সাথে মানাবে কিনা তা নিশ্চিত নয়।
অভিজিৎ

যদিও এটি সম্ভবত ওপি চেয়েছিল, পাইথন ২.7 এর অনুরূপ প্রশ্নের সাথে এটি ঠিক মেলে না। তারা স্পষ্টভাবে এটি টাইপ ইউনিকোডে কাজ করার জন্য বলেছিল এবং টাইপের জন্য আচরণটি নির্দিষ্ট করে নি str
উইম

1
@ উইম আসলে প্রশ্নটি কখনই অজগর সংস্করণের কথা উল্লেখ করে না, একে একে পাই যে অজগর 2 হওয়া উচিত। 7 । এছাড়াও লক্ষ করুন যে পাইথন 2 u'true' == 'true'এ ফাংশনটি ইনপুট টাইপ থেকে [ strএবং এর মধ্যে unicode] থেকে নির্বিচারে সঠিকভাবে আচরণ করে ।
বাকুরিউ

তবে বাকুরিউ, এটাই আমার বক্তব্য, "সমস্যা" হ'ল u'true' == 'true'এবং ব্যবহারের ক্ষেত্রে কী তা আমরা জানি না। তারা পরিস্থিতি যেখানে একটি ভিন্ন আচরণ চান type(x) != unicode
wim

1
@ অ্যালবার্টচেন: না, কারণ নম্পি অ্যারে সম্প্রচারের তুলনা করে এবং কোনও বুলিয়ান মান দেয় না। পরিবর্তে, তুলনাগুলি বুলিয়ান মানগুলির একটি অ্যারে উত্পাদন করে । আমি arrayvalue == 'true'তুলনা থেকে আপনি কী আশা করেন তা নিশ্চিত নই , আমি এখানে যে উত্তরটি উত্তর দিয়েছি তা একটি স্ট্রিং (ইউনিকোড) মানের সাথে নির্দিষ্ট।
মার্টিজন পিটারস

136

যদি Bবুলিয়ান অ্যারে হয় তবে লিখুন

B = B*1

(একটি বিট কোড গল্ফ।)


1
এই একই জিনিসটি একক মানগুলির জন্যও কাজ করে। এটা অসাধারণ!
ব্যবহারকারী31415

2
পাইথন 3 এ আমার জন্য কাজ করে না (অ্যারে বুলিয়ান থাকে)। কিন্তু numpy.multiply(B,1)কাজ ব্যবহার করে।
আলা এম।

এটি অজগর 3 এ আমার জন্য কাজ করে! এবং যেমন উজ্জ্বল সমাধান। ওহ আমার
সর্বদা প্রশংসনীয়

@ অরবোর্স: আপনার পরামর্শটি অনুসরণ করার চেষ্টা করা আমার পক্ষে কাজ করেনি ile মূল সলশনটি যখন একটি সুন্দর, B=map(int,B)কার্যক্ষম ফলাফল দিয়েছে তখন আমার জন্য পাইথন ৩-এ মানচিত্রের মানচিত্র ফিরিয়ে দিয়েছে।
Eulenfuchswiesel

1
@ ইউলেনফুচসুইজেল এটি কারণ ম্যাপটি পাইথন 3-এ একটি পুনরাবৃত্তি প্রদান করে। এটি একটি তালিকা হিসাবে ব্যবহার করতে, এটির মতো একটি তালিকা হিসাবে কাস্ট করুন: বি = তালিকা (মানচিত্র (ইনট, বি))
গিগি বাইতে 2

11

আপনি x.astype('uint8')কোথায় xআপনার বুলিয়ান অ্যারে ব্যবহার করতে পারেন ।


9

আপনার সমস্যার আরও একটি সমাধান এখানে দেওয়া হল:

def to_bool(s):
    return 1 - sum(map(ord, s)) % 2
    # return 1 - sum(s.encode('ascii')) % 2  # Alternative for Python 3

এটি কাজ করে কারণ ASCII কোড এর সমষ্টি 'true'হল 448, যা এমনকি, যখন এর ASCII কোড এর সমষ্টি 'false'হল 523যা বিজোড় হয়।


এই সমাধানটি সম্পর্কে মজার বিষয় হ'ল এর ফলাফলটি বেশ এলোমেলো হয় যদি ইনপুটটি এক বা এক না হয় । অর্ধেক সময় এটি ফিরে আসবে , এবং বাকি অর্ধেক । ইনপুটটি ASCII না হলে এই রূপটি ব্যবহার করে এনকোডিং ত্রুটি বাড়বে (এভাবে আচরণের অপরিজ্ঞাত-নেস বাড়ানো হবে)।'true''false'01encode


গুরুতরভাবে, আমি বিশ্বাস করি সর্বাধিক পঠনযোগ্য এবং দ্রুত , সমাধানটি হ'ল if:

def to_bool(s):
    return 1 if s == 'true' else 0

কিছু মাইক্রোব্যাঙ্কমার্ক দেখুন:

In [14]: def most_readable(s):
    ...:     return 1 if s == 'true' else 0

In [15]: def int_cast(s):
    ...:     return int(s == 'true')

In [16]: def str2bool(s):
    ...:     try:
    ...:         return ['false', 'true'].index(s)
    ...:     except (ValueError, AttributeError):
    ...:         raise ValueError()

In [17]: def str2bool2(s):
    ...:     try:
    ...:         return ('false', 'true').index(s)
    ...:     except (ValueError, AttributeError):
    ...:         raise ValueError()

In [18]: def to_bool(s):
    ...:     return 1 - sum(s.encode('ascii')) % 2

In [19]: %timeit most_readable('true')
10000000 loops, best of 3: 112 ns per loop

In [20]: %timeit most_readable('false')
10000000 loops, best of 3: 109 ns per loop

In [21]: %timeit int_cast('true')
1000000 loops, best of 3: 259 ns per loop

In [22]: %timeit int_cast('false')
1000000 loops, best of 3: 262 ns per loop

In [23]: %timeit str2bool('true')
1000000 loops, best of 3: 343 ns per loop

In [24]: %timeit str2bool('false')
1000000 loops, best of 3: 325 ns per loop

In [25]: %timeit str2bool2('true')
1000000 loops, best of 3: 295 ns per loop

In [26]: %timeit str2bool2('false')
1000000 loops, best of 3: 277 ns per loop

In [27]: %timeit to_bool('true')
1000000 loops, best of 3: 607 ns per loop

In [28]: %timeit to_bool('false')
1000000 loops, best of 3: 612 ns per loop

লক্ষ্য করুন কিভাবে ifসমাধান অন্তত 2.5x বার দ্রুততর তুলনায় সব অন্যান্য সমাধান। এটা আছে না জানার জন্য প্রয়োজন যেমন লাগাতে ব্যবহার এড়াতে ifছাড়া এই বাড়ির কাজ কিছু আছে (যে ক্ষেত্রে আপনি প্রথম স্থানে এই জিজ্ঞাসা করা উচিত নয়) গুলি।


7

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

>>> def str2bool(st):
try:
    return ['false', 'true'].index(st.lower())
except (ValueError, AttributeError):
    raise ValueError('no Valid Conversion Possible')


>>> str2bool('garbaze')

Traceback (most recent call last):
  File "<pyshell#106>", line 1, in <module>
    str2bool('garbaze')
  File "<pyshell#105>", line 5, in str2bool
    raise TypeError('no Valid COnversion Possible')
TypeError: no Valid Conversion Possible
>>> str2bool('false')
0
>>> str2bool('True')
1

2
কেন TypeError? যদি স্ট্রিংটিতে না থাকে 'true'বা 'false'এটিতে একটি মান ত্রুটি থাকে। যদি ইনপুটটি স্ট্রিং না হয় তবে আপনি তার AttributeErrorপরিবর্তে (99.99% বার) পাচ্ছেন , অতএব এটি এটির ValueErrorজন্য এটি পুনরায় বাছাই করা অযথা TypeError
বাকুরিউ

@ বাকুরিউ: আমি একমত প্রকারভেদ প্রকৃতপক্ষে এখানে প্রযোজ্য ছিল না।
অভিজিৎ

@ বাকুরিউ: কৌতূহলের বাইরে আপনি কি indexএট্রিবিউটআরারের উত্থানের উদাহরণ দিতে পারেন ?
জর্জি

@Bakuriu: আমি অনুমান আমি বরং নিচে আপনার পোস্টে উল্লেখ করা হয়েছে: return ['false', 'true'].index(s) except (ValueError, AttributeError)
জর্জি

@ thg435 এই পোস্টে আমি কেবল অনুলিপি-আটকানো করেছি এবং lower()কলটি সরিয়ে ফেলার সিদ্ধান্ত নিয়েছি কারণ এটি কেবলমাত্র এই অতিরিক্ত গণনা করেছিল এবং এটি মাইক্রো-বেঞ্চমার্কে অন্তর্ভুক্ত করা সঠিক হবে না। অবশ্যই try...exceptকিছুটা সময় নেবেন অবশ্যই , তবে কোনও ব্যতিক্রম না বাড়ানো থাকলে ( 20nsকম বা এর মতো ) পার্থক্যটি সামান্য ।
বাকুরিউ

0

বুল টু ইন্টার: x = (x == 'true') + 0

এখন x এর মধ্যে 1 থাকে যদি x == 'true'অন্য 0 হয়।

দ্রষ্টব্য: x == 'true'বুলটি ফেরত দেবে যা 0 এর সাথে যুক্ত হওয়ার পরে টাইপ টেস্ট করা হবে (1 যদি বুল মানটি অন্য 0 হয়) 0


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