পাইথনে একটি মান কীভাবে টগল করা যায়


127

0এবং এর মধ্যে টগল করার সবচেয়ে কার্যকর উপায় কোনটি 1?


এই প্রশ্নটি কীভাবে বাইনারি পদ্ধতিতে মানগুলি সবচেয়ে দক্ষতার সাথে টগল করতে হয় তা জিজ্ঞাসা করার সময়, কিছু উত্তর সাইক্লিংকে (স্বেচ্ছাসেবী) মানগুলির মাধ্যমে ব্যাখ্যা করে, যেমন স্ট্যাকওভারফ্লো.com
পাগল

উত্তর:


272

সমাধান ব্যবহার না

মান বুলিয়ান হন, দ্রুততম পদ্ধতির ব্যবহার করা না অপারেটর:

>>> x = True
>>> x = not x        # toggle
>>> x
False
>>> x = not x        # toggle
>>> x
True
>>> x = not x        # toggle
>>> x
False

বিয়োগফল ব্যবহার করে সমাধান

মানগুলি যদি সংখ্যাগত হয় তবে মোট থেকে বিয়োগটি মানগুলি টগল করার একটি সহজ এবং দ্রুত উপায়:

>>> A = 5
>>> B = 3
>>> total = A + B
>>> x = A
>>> x = total - x    # toggle
>>> x
3
>>> x = total - x    # toggle
>>> x
5
>>> x = total - x    # toggle
>>> x
3

এক্সওআর ব্যবহার করে সমাধান

মধ্যে মান টগল তাহলে 0 এবং 1 , আপনি একটি ব্যবহার করতে পারেন , bitwise একচেটিয়া বা :

>>> x = 1
>>> x ^= 1
>>> x
0
>>> x ^= 1
>>> x
1

কৌশলটি কোনও জোড় সংখ্যায় সাধারণীকরণ করে। জোর-ও-ওয়ান স্টেপটি একটি জোর-বাই-প্রম্পম্পিউটেড-ধ্রুবক দ্বারা প্রতিস্থাপন করা হয়েছে:

>>> A = 205
>>> B = -117
>>> t = A ^ B        # precomputed toggle constant
>>> x = A
>>> x ^= t           # toggle
>>> x
-117
>>> x ^= t           # toggle
>>> x
205
>>> x ^= t           # toggle
>>> x
-117

(এই ধারণা নিক কোগলান জমা দিয়েছেন এবং পরে @zxxc দ্বারা সাধারণীকরণ করা হয়েছে।)

একটি অভিধান ব্যবহার করে সমাধান

মানগুলি যদি হ্যাশযোগ্য হয় তবে আপনি একটি অভিধান ব্যবহার করতে পারেন:

>>> A = 'xyz'
>>> B = 'pdq'
>>> d = {A:B, B:A}
>>> x = A
>>> x = d[x]         # toggle
>>> x
'pdq'
>>> x = d[x]         # toggle
>>> x
'xyz'
>>> x = d[x]         # toggle
>>> x
'pdq'

শর্তসাপেক্ষ এক্সপ্রেশন ব্যবহার করে সমাধান

সবচেয়ে ধীরতম উপায় হ'ল শর্তযুক্ত অভিব্যক্তিটি ব্যবহার করা :

>>> A = [1,2,3]
>>> B = [4,5,6]
>>> x = A
>>> x = B if x == A else A
>>> x
[4, 5, 6]
>>> x = B if x == A else A
>>> x
[1, 2, 3]
>>> x = B if x == A else A
>>> x
[4, 5, 6]

ইটারটুলগুলি ব্যবহার করে সমাধান করুন

আপনার যদি দুটিরও বেশি মান থাকে তবে এটিরটোউলসাইকেল () ফাংশন ক্রমাগত মানগুলির মধ্যে টগল করার একটি জেনেরিক দ্রুত উপায় সরবরাহ করে:

>>> import itertools
>>> toggle = itertools.cycle(['red', 'green', 'blue']).next
>>> toggle()
'red'
>>> toggle()
'green'
>>> toggle()
'blue'
>>> toggle()
'red'
>>> toggle()
'green'
>>> toggle()
'blue'

দ্রষ্টব্য যে পাইথন 3 এ next()পদ্ধতিটি পরিবর্তিত হয়েছিল __next__(), সুতরাং প্রথম লাইনটি এখন যেমন লেখা থাকবেtoggle = itertools.cycle(['red', 'green', 'blue']).__next__


শেষ উদাহরণটি এত চটুল এবং স্বজ্ঞাত বলে মনে হচ্ছে, তবে .next () অপসারণের সাথে পাইথন 3+ এ কাজ করে না। পাইথনের পরবর্তী সংস্করণে এটিকে একইভাবে কাজ করার কোনও উপায় আছে কি?
লবার্ন

2
@ লাবরনা পাইথন 3-এ, .next()একটি বিশ্বব্যাপী next()ফাংশন দ্বারা প্রতিস্থাপিত হয়েছে । উপরোক্ত উদাহরণে হবে:toggle = itertools.cycle(...); next(toggle)
elpres

2
toggle = itertools.cycle(['red', 'green', 'blue']) next(toggle)
ম্যাক্সিমিলিয়ান

7
এক্সওআর উদাহরণটি মান aএবং bব্যবহারের মধ্যে টগল করার জন্য সাধারণীকরণ করা যেতে পারে x = x ^ (a ^ b)
zxxc

int(not 0)এবং int(not 1)...
hrmmm

33

আমি সবসময় ব্যবহার:

p^=True

পি যদি বুলিয়ান হয় তবে সত্য এবং মিথ্যাটির মধ্যে এই পরিবর্তন হয়।


1
পারফেক্ট! pএই পদ্ধতির কাজ করার জন্য দু'বার রেফারেন্স দেওয়ার দরকার নেই !! আপনি যদি দীর্ঘ দীর্ঘ রেফারেন্স সহ কোনও মান টগল করছেন তবে ধারণা।
থারস্মমনার

1
এই অপারেটরটি কি বলা হয়?
মিশ্রিত 3

4
এটি এক্সওআর অপারেটর।
বাসস্টেল্পপ

1
@ mix3d অবশ্যই এটি "বিটওয়াইজ এক্সক্লুসিভ বা" ("লজিকাল এক্সক্লুসিভ বা" এর বিপরীতে) - wiki.python.org/moin/BitwiseOperators । লজিক্যাল XOR যাও নেই সাধারণভাবে পাইথন মধ্যে একটি নির্দিষ্ট অপারেটর কিন্তু আপনি তা বাস্তবায়িত জানতে পারেন কিছু বিশেষ ক্ষেত্রে দশমিক মডিউলে মত।
টেলর এডমিস্টন

@ মিক্স 3 ডি ^=বিটওয়াইজ এক্সার অ্যাসিগমেন্ট
ওয়াজান্ড্রেয়া

23

এখানে অন্য একটি স্বজ্ঞাত উপায়। সৌন্দর্য হ'ল আপনি একাধিক মূল্যবোধের উপর নির্ভর করতে পারেন এবং কেবল দুটি নয় [0,1]

দুটি মানের জন্য (টগলিং)

>>> x=[1,0]
>>> toggle=x[toggle]

একাধিক মান জন্য (বলুন 4)

>>> x=[1,2,3,0]
>>> toggle=x[toggle]

আমি আশা করি না যে এই সমাধানটিও খুব দ্রুত হবে

>>> stmt1="""
toggle=0
for i in xrange(0,100):
    toggle = 1 if toggle == 0 else 0
"""
>>> stmt2="""
x=[1,0]
toggle=0
for i in xrange(0,100):
    toggle=x[toggle]
"""
>>> t1=timeit.Timer(stmt=stmt1)
>>> t2=timeit.Timer(stmt=stmt2)
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=100000)/100000)
7.07 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=100000)/100000)
6.19 usec/pass
stmt3="""
toggle = False
for i in xrange(0,100):
    toggle = (not toggle) & 1
"""
>>> t3=timeit.Timer(stmt=stmt3)
>>> print "%.2f usec/pass" % (1000000 * t3.timeit(number=100000)/100000)
9.84 usec/pass
>>> stmt4="""
x=0
for i in xrange(0,100):
    x=x-1
"""
>>> t4=timeit.Timer(stmt=stmt4)
>>> print "%.2f usec/pass" % (1000000 * t4.timeit(number=100000)/100000)
6.32 usec/pass

1
হ্যাঁ বাদামের মতো স্কুইটকে ঠাট্টা করে। সবাইকে ধন্যবাদ এই

ভাল, এটি একটি ক্ষুদ্র রাষ্ট্র মেশিন।
সাফল্য

ঠিক আছে, আপনার একটি সবচেয়ে আকর্ষণীয়, তবে আমি যা জিজ্ঞাসা করছি তার জন্য ব্যক্তিগতভাবে আমার যা প্রয়োজন তা নয়, তাই ঠিক আছে, আমি মনে করি সহজ গণিতটি আমার পক্ষে সম্ভবত সবচেয়ে সেরা, সেখানে 1-x হওয়া উচিত নয়?

হ্যাঁ, তবে গতিটিকে কোনও আলাদা করা উচিত নয়।
ব্লেন্ডার

আই, তবে এটি ভুল করে ফেলবে যদিও তা চাইবে না? কিছু দুর্দান্ত উত্তর এখানে, তাই!

19

notঅপারেটরকে আপনার পরিবর্তনশীল negates (এটা একটি বুলিয়ান মধ্যে রূপান্তর এটি ইতিমধ্যেই এক নয়)। আপনি করতে পারেন সম্ভবত ব্যবহার 1এবং 0সঙ্গে অদলবদল করে Trueএবং False, তাই শুধু এটা অস্বীকার:

toggle = not toggle

তবে আপনি যদি দুটি নির্বিচার মান ব্যবহার করছেন তবে একটি ইনলাইন ব্যবহার করুন if:

toggle = 'a' if toggle == 'b' else 'b'

1
+1 তবে toggle = 0 if toggle else 1খাটো এবং আরও সাধারণ
লু

দুঃখিত, আমি এটি পরিষ্কার করার জন্য ভেরিয়েবলগুলি অদলবদল করব। আমি ifইনলাইনটি কেবল এবং না হয়ে দুটি স্বেচ্ছাচারী ভেরিয়েবলের মধ্যে টগল করতে ব্যবহার করছিলাম । 10
ব্লেন্ডার

14

মাত্র 1 এবং 0 এর মধ্যে, এটি করুন

1-x 

x 1 বা 0 নিতে পারে


যেহেতু (পাইথন ২.x-তে, যাইহোক) Trueএবং Falseপ্রকৃতপক্ষে পূর্ণসংখ্যা হয়, তবে আশ্চর্যজনকভাবে ভার্বোজ __str__()পদ্ধতিতেও xএটি Trueবা Falseএখানেও হতে পারে । যদিও আপনি 1 বা 0 ফিরে পাবেন।
কিনুন

12

ত্রিগনোমেট্রিক পদ্ধতি , কেবল কারণ sinএবং cosফাংশনগুলি দুর্দান্ত।

এখানে চিত্র বর্ণনা লিখুন

>>> import math
>>> def generator01():
...     n=0
...     while True:
...         yield abs( int( math.cos( n * 0.5 * math.pi  ) ) )
...         n+=1
... 
>>> g=generator01() 
>>> g.next()
1
>>> g.next()
0
>>> g.next()
1
>>> g.next()
0

হে ভগবান! আমি <3 আপনি।
habষভ অগ্রহরি

2
@ Habষভআগ্রহরি, হ্যাঁ, আমি ছিলাম রেমন্ড হেটিঙ্গারের চ্যালেঞ্জ বিজয়ী ;)
দানি হেরেরা

7

আশ্চর্যজনকভাবে কেউই পুরানো বিভাগের 2 টি মডুলোর উল্লেখ করেনি:

In : x = (x + 1)  % 2 ; x
Out: 1

In : x = (x + 1)  % 2 ; x
Out: 0

In : x = (x + 1)  % 2 ; x
Out: 1

In : x = (x + 1)  % 2 ; x
Out: 0

মনে রাখবেন এটি সমান x = x - 1, তবে মডুলো প্রযুক্তির সুবিধা হ'ল গ্রুপের আকার বা ব্যবধানের দৈর্ঘ্য মাত্র 2 টি বড় হতে পারে, এভাবে আপনাকে লুপ ওভার করতে রাউন্ড-রবিন ইন্টারলিভিং স্কিমের অনুরূপ দেয়।

এখন কেবল ২ এর জন্য, টগলিং কিছুটা খাটো হতে পারে (বিট-ওয়াইড অপারেটর ব্যবহার করে):

x = x ^ 1

আমি নিশ্চিত নই যে এটি (সি-জাতীয়) মডুলো গাণিতিক (i, e, "পাইথোনিক" প্রয়োগ হয় কিনা) কীভাবে "পাইথোনিক" হয়) আমি অনুমান করি এটি কেবল পাটিগণিত, অন্য জায়গায় যেখানে আপনার বাইনারি রয়েছে সেখানে কাজ করে।
ইয়াহেন ইয়াকিমোভিচ

স্পষ্টতই x = (1,2,3,0) এর মত টিপল সহ সসীম-রাষ্ট্রীয় মেশিন; টোকেন = 0; টোকেন = এক্স [টোকেন] অত্যন্ত উত্তেজনাপূর্ণ, যেহেতু এটি কেবলমাত্র গ্রুপ অপারেশন থেকেও সাধারণ হতে পারে।
ইয়াহেন ইয়াকিমোভিচ

7

একাধিক অ্যাসাইনমেন্ট ব্যবহার করে টগল করার একটি উপায়

>>> a = 5
>>> b = 3

>>> t = a, b = b, a
>>> t[0]
3

>>> t = a, b = b, a
>>> t[0]
5

ইটারটুলগুলি ব্যবহার করে:

In [12]: foo = itertools.cycle([1, 2, 3])

In [13]: next(foo)
Out[13]: 1

In [14]: next(foo)
Out[14]: 2

In [15]: next(foo)
Out[15]: 3

In [16]: next(foo)
Out[16]: 1

In [17]: next(foo)
Out[17]: 2

4

1 এবং 0 এর মধ্যে টগল করার সবচেয়ে সহজ উপায় হ'ল 1 থেকে বিয়োগ করা।

def toggle(value):
    return 1 - value

4

ব্যতিক্রম হ্যান্ডলার ব্যবহার করে

>>> def toogle(x):
...     try:
...         return x/x-x/x
...     except  ZeroDivisionError:
...         return 1
... 
>>> x=0
>>> x=toogle(x)
>>> x
1
>>> x=toogle(x)
>>> x
0
>>> x=toogle(x)
>>> x
1
>>> x=toogle(x)
>>> x
0

ঠিক আছে, আমি সবচেয়ে খারাপ:

এখানে চিত্র বর্ণনা লিখুন

import math
import sys

d={1:0,0:1}
l=[1,0]

def exception_approach(x):
    try:
        return x/x-x/x
    except  ZeroDivisionError:
        return 1

def cosinus_approach(x):
    return abs( int( math.cos( x * 0.5 * math.pi  ) ) )

def module_approach(x):
    return  (x + 1)  % 2

def subs_approach(x):
    return  x - 1

def if_approach(x):
    return 0 if x == 1 else 1

def list_approach(x):
    global l
    return l[x]

def dict_approach(x):
    global d
    return d[x]

def xor_approach(x):
    return x^1

def not_approach(x):
    b=bool(x)
    p=not b
    return int(p)

funcs=[ exception_approach, cosinus_approach, dict_approach, module_approach, subs_approach, if_approach, list_approach, xor_approach, not_approach ]

f=funcs[int(sys.argv[1])]
print "\n\n\n", f.func_name
x=0
for _ in range(0,100000000):
    x=f(x)

3

কীভাবে এমন একটি কল্পিত টগল যা কেবলমাত্র বর্তমান টগলকেই নয়, এর সাথে যুক্ত আরও কয়েকটি মান আছে?

toggle = complex.conjugate

বামে যে কোনও + বা - মান এবং ডানদিকে কোনও স্বাক্ষরবিহীন মান সংরক্ষণ করুন:

>>> x = 2 - 3j
>>> toggle(x)
(2+3j)

জিরোও কাজ করে:

>>> y = -2 - 0j
>>> toggle(y)
(-2+0j)

সহজেই বর্তমান টগল মান ( Trueএবং Falseউপস্থাপনা + এবং -), এলএইচএস (বাস্তব) মান, বা আরএইচএস (কল্পিত) মানটি সহজেই পুনরুদ্ধার করুন :

>>> import math
>>> curr = lambda i: math.atan2(i.imag, -abs(i.imag)) > 0
>>> lhs = lambda i: i.real
>>> rhs = lambda i: abs(i.imag)
>>> x = toggle(x)
>>> curr(x)
True
>>> lhs(x)
2.0
>>> rhs(x)
3.0

সহজেই এলএইচএস এবং আরএইচএস অদলবদল করুন (তবে লক্ষ্য করুন যে উভয় মানের সাইন অবশ্যই গুরুত্বপূর্ণ হবে না):

>>> swap = lambda i: i/-1j
>>> swap(2+0j)
2j
>>> swap(3+2j)
(2+3j)

সহজেই এলএইচএস এবং আরএইচএস অদলবদল করুন এবং একই সাথে টগল করুন:

>>> swaggle = lambda i: i/1j
>>> swaggle(2+0j)
-2j
>>> swaggle(3+2j)
(2-3j)

ত্রুটির বিরুদ্ধে রক্ষীরা:

>>> toggle(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor 'conjugate' requires a 'complex' object but received a 'int'

এলএইচএস এবং আরএইচএসে পরিবর্তনগুলি সম্পাদন করুন:

>>> x += 1+2j
>>> x
(3+5j)

... তবে আরএইচএসে কৌশলে সাবধানতা অবলম্বন করুন:

>>> z = 1-1j
>>> z += 2j
>>> z
(1+1j) # whoops! toggled it!

2

ভেরিয়েবল এ এবং বি এর মান দুটি হতে পারে যেমন 0 এবং 1, বা 117 এবং 711, বা "মাথা" এবং "লেজ"। কোনও গণিত ব্যবহার করা হয় না, প্রতিবার একটি টগল পছন্দ হলে মানগুলির কেবলমাত্র দ্রুত অদলবদল হয়।

a = True   
b = False   

a,b = b,a   # a is now False
a,b = b,a   # a is now True

1

আমি অ্যাবস ফাংশন ব্যবহার করি, লুপগুলিতে খুব দরকারী

x = 1
for y in range(0, 3):
    x = abs(x - 1)

এক্স 0 হবে।


0

আসুন কিছু ফ্রেম হ্যাকিং করা যাক। নামে একটি ভেরিয়েবল টগল করুন। দ্রষ্টব্য: এটি প্রতিটি পাইথন রানটাইমের সাথে কাজ করতে পারে না।

বলুন আপনার একটি পরিবর্তনশীল "এক্স" রয়েছে

>>> import inspect
>>> def toggle(var_name):
>>>     frame = inspect.currentframe().f_back
>>>     vars = frame.f_locals
>>>     vars[var_name] = 0 if vars[var_name] == 1 else 1

>>> x = 0
>>> toggle('x')
>>> x
1
>>> toggle('x')
>>> x
0

0

আপনি যদি একটি পূর্ণসংখ্যের ভেরিয়েবলের সাথে ডিল করছেন, আপনি 1 বৃদ্ধি করতে পারেন এবং আপনার সেটটি 0 এবং 1 (Mod) এ সীমাবদ্ধ করতে পারেন

X = 0  # or X = 1
X = (X + 1)%2

0

-1 এবং +1 এর মধ্যে স্যুইচিং ইনলাইন গুন দ্বারা প্রাপ্ত করা যেতে পারে; পাই 'লাইবনিজ' উপায় (বা অনুরূপ) গণনার জন্য ব্যবহৃত:

sign = 1
result = 0
for i in range(100000):
    result += 1 / (2*i + 1) * sign
    sign *= -1
print("pi (estimate): ", result*4)

0

আপনি ব্যবহার করতে পারেন indexএর listগুলি।

def toggleValues(values, currentValue):
    return values[(values.index(currentValue) + 1) % len(values)]

> toggleValues( [0,1] , 1 )
> 0
> toggleValues( ["one","two","three"] , "one" )
> "two"
> toggleValues( ["one","two","three"] , "three")
> "one"

পেশাদাররা : কোনও অতিরিক্ত লাইব্রেরি, সেলফ এক্সপ্ল্যান্টরি কোড এবং যথেচ্ছ ডেটা ধরণের সাথে কাজ করে না।

কনস : ডুপ্লিকেট-সেভ নয়। toggleValues(["one","two","duped", "three", "duped", "four"], "duped") সর্বদা ফিরে আসবে"three"

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