পাইথনে টিলড অপারেটর


199

পাইথনে টিলড অপারেটরের ব্যবহার কী?

আমি যা ভাবতে পারি তা হ'ল স্ট্রিং বা তালিকার উভয় পক্ষের কিছু করা যেমন স্ট্রিংটি প্যালিনড্রোমিক কিনা তা পরীক্ষা করে দেখুন:

def is_palindromic(s):
    return all(s[i] == s[~i] for i in range(len(s) / 2)) 

অন্য কোন ভাল ব্যবহার?


11
নোট করুন যে ~বিশেষ পদ্ধতি দ্বারা প্রয়োগ করা ইউনিারি পরিপূরক অপারেটর অপারেটরের __invert__সাথে সম্পর্কিত নয় not, যা যুক্তিযুক্তভাবে প্রত্যাবর্তিত মানটিকে __bool__(বা __nonzero__2.x) অবহেলা করে। এটি -বাস্তবায়িত অ্যানারি নেগ্রেশন অপারেটরের সাথেও সম্পর্কিত নয় __neg__। উদাহরণস্বরূপ ~True == -2, যা কোনটি Falseমিথ্যা নয় এবং -False == 0যা এখনও মিথ্যা।
এরিক সান

@ এরিকসুন, যদিও আপনি যা বলেছেন তা সঠিক ( -False==0) এটি বিভ্রান্তিকর, যেহেতু আপনি সেই বিষয়ে কথা বলছিলেন ~, এবং ~False == -1কোনটি মিথ্যা নয়।
গিলহেরেম দে লাজারী

3
@ গুহেরহেরেমিডে লাজারী, দ্বিতীয় উদাহরণটি ছিল গাণিতিক অবহেলা ( __neg__) এর সাথে তুলনা করা । সম্ভবত আমার ব্যবহার অব্যাহত রাখা উচিত ছিল True, উদাহরণস্বরূপ -True == -1, যা -২ বা Falseমিথ্যা নয়, যা এটিকে আরও পরিষ্কারভাবে ~Trueফলাফলের সাথে আবার যুক্ত করে এবং এটিও যে গাণিতিক অবজ্ঞা boolতার যৌক্তিক অবজ্ঞা থেকে পৃথক। আমি গভীর হওয়ার চেষ্টা করছিলাম না। আমি কেবল 3 টি অপারেশন এবং অন্তর্নিহিত বিশেষ পদ্ধতিগুলি হাইলাইট করছিলাম যা কখনও কখনও বিভ্রান্ত হয়।
এরিক সান

উত্তর:


192

এটি সিআর থেকে ধার করা একটি অ্যানারি অপারেটর (একক যুক্তি গ্রহণ করে), যেখানে সমস্ত ডেটা টাইপগুলি বাইটকে ব্যাখ্যা করার বিভিন্ন উপায়। এটি "বিপরীত" বা "পরিপূরক" অপারেশন, যাতে ইনপুট ডেটার সমস্ত বিট বিপরীত হয়।

পাইথনে, পূর্ণসংখ্যার জন্য, পূর্ণসংখ্যার দ্বিগুণ-পরিপূরক উপস্থাপনের বিটগুলি বিপরীত হয় ( b <- b XOR 1প্রতিটি পৃথক বিটের ক্ষেত্রে) এবং ফলাফলটি আবারো দ্বিগুণ-পরিপূরক পূর্ণসংখ্যার হিসাবে ব্যাখ্যা হয়। সুতরাং পূর্ণসংখ্যার জন্য, ~xসমতুল্য (-x) - 1

~অপারেটরের রিফাইড ফর্ম হিসাবে সরবরাহ করা হয় operator.invert। আপনার নিজের ক্লাসে এই অপারেটরকে সমর্থন করার জন্য, এটি একটি __invert__(self)পদ্ধতি দিন।

>>> import operator
>>> class Foo:
...   def __invert__(self):
...     print 'invert'
...
>>> x = Foo()
>>> operator.invert(x)
invert
>>> ~x
invert

যে শ্রেণীর মধ্যে এটির অর্থের পরিপূরক বা "বিপরীতমুখী" থাকা অর্থের একই অর্থ একই শ্রেণীর উদাহরণ, এটি ইনভার্ট অপারেটরের সম্ভাব্য প্রার্থী। তবে অপারেটর ওভারলোডিং অপব্যবহার করা হলে বিভ্রান্তি ঘটাতে পারে, তাই নিশ্চিত হয়ে নিন যে __invert__আপনার ক্লাসে কোনও পদ্ধতি সরবরাহের আগে এটি করা সত্যই বোধগম্য । (দ্রষ্টব্য যে বাইট-স্ট্রিংগুলি [প্রাক্তন: '\xff'] এই অপারেটরটিকে সমর্থন করে না, যদিও এটি বাইট-স্ট্রিংয়ের সমস্ত বিট বিপরীত করা অর্থবহ।)


16
ভাল ব্যাখ্যা, তবে একটি সতর্কতার শব্দ - অপারেটর ওভারলোডিংয়ের জন্য সমস্ত সুরক্ষা অস্বীকৃতি এখানে প্রয়োগ করুন - এটি बिलটি পুরোপুরি ফিট করে না, তবে এটি ভাল ধারণা নয়।
এলি বেন্ডারস্কি

এলির প্রতিক্রিয়া চূড়ান্ত অনুচ্ছেদে উত্তরের সাথে সংযুক্ত করা হয়েছে।
ওয়াবেরি

91

~হয় , bitwise সম্পূরক অপারেটর পাইথন যা মূলত হিসাব-x - 1

সুতরাং একটি টেবিল দেখতে হবে

i  ~i  
0  -1
1  -2
2  -3
3  -4 
4  -5 
5  -6

সুতরাং i = 0এটির সাথে তুলনা s[0]করা s[len(s) - 1]উচিত i = 1, s[1]সাথে , সাথেs[len(s) - 2]

আপনার অন্যান্য প্রশ্নের হিসাবে, এটি বিটওয়াইস হ্যাকগুলির একটি শ্রেণির জন্য কার্যকর হতে পারে ।


26

বিটওয়াস পরিপূরক অপারেটর হওয়া ছাড়াও, বুলিয়ান মানটি ~ফিরিয়ে আনতে সহায়তা করতে পারে , যদিও এটি এখানে প্রচলিত ধরণের নয়, বরং আপনার ব্যবহার করা উচিত ।boolnumpy.bool_


এটি ব্যাখ্যা করা হয়েছে,

import numpy as np
assert ~np.True_ == np.False_

লজিক্যাল মানটিকে বিপরীত করা কখনও কখনও দরকারী হতে পারে, উদাহরণস্বরূপ, নীচে ~অপারেটরটি আপনার ডেটাসেটটি পরিষ্কার করার জন্য এবং আপনাকে এনএএন ছাড়াই একটি কলাম ফিরিয়ে আনতে ব্যবহৃত হয়।

from numpy import NaN
import pandas as pd

matrix = pd.DataFrame([1,2,3,4,NaN], columns=['Number'], dtype='float64')
# Remove NaN in column 'Number'
matrix['Number'][~matrix['Number'].isnull()]

numpy.NaNহিসাবে সংজ্ঞায়িত বলে মনে হচ্ছে numpy.float। আমি যদি চেষ্টা করি তবে ~numpy.NaNপাইথন অভিযোগ করে যে ইউনিারি অপারেটর ~টাইপের জন্য সংজ্ঞায়িত হয়নি numpy.float
এম হারজক্যাম্প

2
@ এম হারজক্যাম্প, এটি সঠিক। নাএন, + ইনফ এবং -আইএনএফ হ'ল ভাসমান-পয়েন্ট সংখ্যাগুলির বিশেষ ক্ষেত্রে। ভাসমান পয়েন্ট সংখ্যার বিটগুলি উল্টানো একটি অযৌক্তিক ফলাফল আনবে, সুতরাং পাইথন এটির অনুমতি দেয় না। এজন্য আপনাকে প্রথমে আপনার ডেটা অ্যারেতে .isnull () বা np.isnan () কল করতে হবে এবং তারপরে ফলস্বরূপ বুলিয়ান মানগুলি উল্টে যাবে।
জিওফলি

7
দ্রষ্টব্য, এতে ~Trueফলাফল আসে -2, যখন নম্পি বুলেটগুলির জন্য ~np.True_ফলাফল হয় False
ক্রিশ্চিয়ান হেরেন্স

ভালো পরামর্শ! আমি এটি একটি ডেটা सेटের
mLstudent33

19

একটি নোট করা উচিত যে অ্যারে ইনডেক্সিংয়ের ক্ষেত্রে, এর array[~i]পরিমাণ reversed_array[i]। এটি অ্যারের শেষ থেকে সূচক হিসাবে দেখা যেতে পারে:

[0, 1, 2, 3, 4, 5, 6, 7, 8]
    ^                 ^
    i                ~i

2
এটি বেশিরভাগ কারণেই যে মানটি ~i(যা নেতিবাচক মান) থেকে বের হয় তা অ্যারে সূচকটির জন্য একটি সূচনা পয়েন্ট হিসাবে কাজ করে যা পাইথন আনন্দের সাথে সূচককে চারপাশে আবদ্ধ করতে এবং পিছন থেকে বাছাইয়ের কারণ হিসাবে গ্রহণ করে।
shriek

4

শুধুমাত্র সময় আমি কখনো বাস্তবে এই ব্যবহার করেছি সাথে আছেন numpy/pandas। উদাহরণস্বরূপ, .isin() ডেটাফ্রেম পদ্ধতি সহ

দস্তাবেজে তারা এই প্রাথমিক উদাহরণটি দেখায়

>>> df.isin([0, 2])
        num_legs  num_wings
falcon      True       True
dog        False       True

তবে পরিবর্তে যদি আপনি সমস্ত সারি [0, 2] এ না চেয়েছিলেন ?

>>> ~df.isin([0, 2])
        num_legs  num_wings
falcon     False       False
dog        True        False

2

আমি এই লেটকোড সমস্যাটি সমাধান করছিলাম এবং আমি জিতাও ওয়াং নামে একজন ব্যবহারকারী দ্বারা এই সুন্দর সমাধানটি পেলাম

প্রদত্ত অ্যারেতে প্রতিটি উপাদানগুলির জন্য সমস্যাটি এইভাবে চলে div O(n) সময়

মানক সমাধানটি হ'ল:

Pass 1: For all elements compute product of all the elements to the left of it
Pass 2: For all elements compute product of all the elements to the right of it
        and then multiplying them for the final answer 

তার সমাধানটি ব্যবহার করে লুপের জন্য কেবল একটি ব্যবহার করে। তিনি উড়ে উড়ে বাম পণ্য এবং ডান পণ্য গণনা করেন~

def productExceptSelf(self, nums):
    res = [1]*len(nums)
    lprod = 1
    rprod = 1
    for i in range(len(nums)):
        res[i] *= lprod
        lprod *= nums[i]
        res[~i] *= rprod
        rprod *= nums[~i]
    return res

-2

এটি হ'ল ছোট্ট ব্যবহার টিল্ড ...

def split_train_test_by_id(data, test_ratio, id_column):
    ids = data[id_column]
    in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio)) 
    return data.loc[~in_test_set], data.loc[in_test_set]

উপরের কোডটি "হ্যান্ডস অন মেশিন লার্নিং" থেকে এসেছে

আপনি সিল ইনডেক্স মার্কার বিকল্প হিসাবে টিলড (~ চিহ্ন) ব্যবহার করেন

যেমন আপনি বিয়োগ ব্যবহার করেন - এটি পূর্ণসংখ্যার সূচকের জন্য

প্রাক্তন)

array = [1,2,3,4,5,6]
print(array[-1])

হিসাবে একই জিনিস

print(array[~1])

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