আমি কিছু কোড জুড়ে এসেছি যার মতো একটি লাইন রয়েছে
x[x<2]=0
বিভিন্নতা নিয়ে ঘুরে বেড়াতে, আমি এখনও এই বাক্য গঠনটি কী করে তাতে আটকা পড়েছি।
উদাহরণ:
>>> x = [1,2,3,4,5]
>>> x[x<2]
1
>>> x[x<3]
1
>>> x[x>2]
2
>>> x[x<2]=0
>>> x
[0, 2, 3, 4, 5]
আমি কিছু কোড জুড়ে এসেছি যার মতো একটি লাইন রয়েছে
x[x<2]=0
বিভিন্নতা নিয়ে ঘুরে বেড়াতে, আমি এখনও এই বাক্য গঠনটি কী করে তাতে আটকা পড়েছি।
উদাহরণ:
>>> x = [1,2,3,4,5]
>>> x[x<2]
1
>>> x[x<3]
1
>>> x[x>2]
2
>>> x[x<2]=0
>>> x
[0, 2, 3, 4, 5]
TypeError: unorderable types: list() < int()
।
উত্তর:
এটি কেবল NumPy অ্যারে দিয়েই বোঝা যায় । তালিকাগুলি সহ আচরণটি অকেজো এবং পাইথন 2 এর সাথে নির্দিষ্ট (পাইথন 3 নয়)। আপনি ডাবল-চেক করতে চাইতে পারেন যে আসল বস্তুটি আসলেই একটি NumPy অ্যারে ছিল (নীচে আরও দেখুন) এবং তালিকাটি নয়।
তবে আপনার কোডে এখানে x একটি সাধারণ তালিকা।
থেকে
x < 2
মিথ্যা অর্থাৎ 0, তাই
x[x<2]
হয় x[0]
x[0]
বদলে যায়
বিপরীতে, x[x>2]
হয় x[True]
বাx[1]
সুতরাং, x[1]
পরিবর্তিত হয়।
কেন এমন হয়?
তুলনার নিয়মগুলি হ'ল:
আপনি যখন দুটি স্ট্রিং বা দুটি সংখ্যার প্রকারের অর্ডার করেন তখন প্রত্যাশিত উপায়ে অর্ডারিং হয় (স্ট্রিংয়ের জন্য ডিক্সিকোগ্রাফিক ক্রম, পূর্ণসংখ্যার জন্য সংখ্যাগত ক্রম)।
আপনি যখন একটি সংখ্যাসূচক এবং একটি অ-সংখ্যািক প্রকার অর্ডার করেন, তখন প্রথম সংখ্যাটি প্রথম আসে type
আপনি যখন দুটি বেমানান প্রকারের অর্ডার করেন যেখানে কোনওটিই সংখ্যাসূচক নয়, সেগুলি তাদের টাইপের নামগুলির বর্ণমালা অনুসারে অর্ডার করা হয়:
সুতরাং, আমরা নিম্নলিখিত আদেশ আছে
সংখ্যার <তালিকা <স্ট্রিং <tuple
পাইথন স্ট্রিং এবং ইনটকে কীভাবে তুলনা করে তার জন্য গৃহীত উত্তর দেখুন ? ।
যদি x একটি NumPy অ্যারে হয় , তবে বুলিয়ান অ্যারে সূচকের কারণে সিনট্যাক্সটি আরও অর্থবোধ করে । সেক্ষেত্রে, x < 2
এ সব একটি বুলিয়ান নয়; এটি বুলিয়ানগুলির একটি অ্যারে প্রতিনিধিত্ব করে যা প্রতিটি উপাদান 2 এর x
চেয়ে কম ছিল কিনা x[x < 2] = 0
তারপরে তার উপাদানগুলি x
2 এর চেয়ে কম ছিল এবং সেগুলি সেলকে 0 এ সেট করে Ind সূচীকরণ দেখুন ।
>>> x = np.array([1., -1., -2., 3])
>>> x < 0
array([False, True, True, False], dtype=bool)
>>> x[x < 0] += 20 # All elements < 0 get increased by 20
>>> x
array([ 1., 19., 18., 3.]) # Only elements < 0 are affected
import
অবাক হয়ে একটি দেখতে পাবেন।
[0 if i < 2 else i for i in x]
।) বা এই নম্প্পিতে উত্সাহিত শৈলী?
x[x<2]
একটি অদ্ভুত অ্যারে প্রদান করবে, যেখানে [0 if i<2 else i for i in x]
একটি তালিকা প্রদর্শন করবে। কারণ x[x<2]
সূচীকরণ অপারেশন (ডেটা মাস্ক করার ক্ষমতার কারণে স্লাইসিং অপারেশন হিসাবে নম্পি / স্কিপি / প্যান্ডাসে উল্লেখ করা হয়), তবে তালিকা অনুধাবনটি একটি নতুন অবজেক্টের সংজ্ঞা। নম্পপি ইনডেক্সিং
>>> x = [1,2,3,4,5]
>>> x<2
False
>>> x[False]
1
>>> x[True]
2
বুলটি কেবল একটি পূর্ণসংখ্যায় রূপান্তরিত হয়। সূচক হয় 0 বা 1।
x
এবং 2
হয় " ধারাবাহিকভাবে কিন্তু ইচ্ছামত আদেশ " এবং ক্রম বিভিন্ন পাইথন বাস্তবায়নের পরিবর্তন হতে পারে।
x<2 == false
?
bool
কোনও পূর্ণসংখ্যায় রূপান্তরিত হয় না, bool
পাইথন- এ একটি পূর্ণসংখ্যা হয়
bool
একটি উপশ্রেণী হয় এর int
।
আপনার প্রশ্নের মূল কোড শুধুমাত্র পাইথন 2. কাজ করে x
একটি list
পাইথন 2 তুলনা x < y
হয় False
যদি y
একটি হয় int
Eger। এটি কারণ এটি একটি পূর্ণসংখ্যার সাথে তালিকার তুলনা করা মানে তোলে না। তবে পাইথন 2-এ, অপারেশনগুলি তুলনামূলক না হলে, তুলনাটি সিপিথনে ভিত্তিক বর্ণগুলির বর্ণানুক্রমিক ক্রম অনুসারে হয় ; অতিরিক্তভাবে সমস্ত সংখ্যা মিশ্র-প্রকারের তুলনায় প্রথম আসে । সিপিথন 2 এর ডকুমেন্টেশনে এটিও বানান নয়, এবং পাইথন 2 বাস্তবায়ন বিভিন্ন ফলাফল দিতে পারে। এটি [1, 2, 3, 4, 5] < 2
মূল্যায়ন করা হয় False
কারণ 2
এটি একটি সংখ্যা এবং এভাবে list
সিপিথনের চেয়ে একটি "ছোট" । এই মিশ্র তুলনা শেষ পর্যন্ত ছিলএকটি বৈশিষ্ট্যটিকে খুব অস্পষ্ট বলে মনে করা হয়েছে এবং পাইথন 3.0 এ সরানো হয়েছে।
এখন, ফলাফল <
একটি bool
; এবং bool
একটি হয় উপশ্রেণী এরint
:
>>> isinstance(False, int)
True
>>> isinstance(True, int)
True
>>> False == 0
True
>>> True == 1
True
>>> False + 5
5
>>> True + 5
6
সুতরাং মূলত আপনি তুলনাটি সত্য বা মিথ্যা কিনা তার উপর নির্ভর করে 0 বা 1 উপাদানটি নিচ্ছেন।
যদি আপনি পাইথন 3 এ উপরের কোডটি চেষ্টা করেন তবে পাইথন 3.0 এর পরিবর্তনেরTypeError: unorderable types: list() < int()
কারণে আপনি পাবেন :
অর্ডার তুলনা
পাইথন 3.0.০ তুলনামূলক ক্রমানুসারে নিয়মকে সহজ করেছে:
ক্রম তুলনা অপারেটরদের (
<
,<=
,>=
,>
) একটি বাড়াতেTypeError
ব্যতিক্রম operands একটি অর্থপূর্ণ প্রাকৃতিক ক্রম হবে না যখন। সুতরাং, এক্সপ্রেশন পছন্দ1 < ''
,0 > None
বাlen <= len
আর বৈধ নয়, আর যেমনNone < None
উত্থাপনTypeError
ফেরার পরিবর্তেFalse
। একটি ছদ্মবেশটি হ'ল ভিন্নজাতীয় তালিকা বাছাই করা আর বোঝা যায় না - সমস্ত উপাদান একে অপরের সাথে তুলনীয় হতে হবে be নোট করুন যে এটি==
এবং!=
অপারেটরদের ক্ষেত্রে প্রযোজ্য নয় : বিভিন্ন অতুলনীয় ধরণের জিনিসগুলি সর্বদা একে অপরের সাথে অসম তুলনা করে।
অনেকগুলি ডেটাটাইপ রয়েছে যা তুলনামূলক অপারেটরদের কিছু আলাদা করার জন্য ওভারলোড করে (পান্ডাস, নম্পির অ্যারে থেকে ডেটাফ্রেম)। কোড আছে, আপনি ব্যবহার করছেন সেটি অন্য কিছু করেনি, কারণ ছিল ছিল না , কিন্তু অপারেটর সঙ্গে কিছু অন্যান্য ক্লাসের একটা নিদর্শন নয় একটি মান ফেরত পাঠাতে ওভাররাইড ; এবং এই মানটি তখন (ওরফে / ) বিশেষভাবে পরিচালনা করেx
list
<
bool
x[]
__getitem__
__setitem__
+False
হাই পার্ল, ওহে জাভাস্ক্রিপ্ট, কেমন আছ?
UNARY_POSITIVE
অপকোডের জন্য যা কল করে__pos__
__setitem__
পরিবর্তে বোঝাতে চেয়েছিলেন __getitem__
। এছাড়াও আমি আশা করি আপনি উত্তর দিবেন না যে আমার উত্তরটি আপনার উত্তরের সেই অংশটি দ্বারা অনুপ্রাণিত হয়েছিল।
__getitem__
যে সমান হতে পারত __setitem__
এবং__delitem__
এর আরও একটি ব্যবহার রয়েছে: কোড গল্ফ। কোড গল্ফ হ'ল প্রোগ্রামগুলি লেখার শিল্প যা সম্ভব যতটা সোর্স কোড বাইটে কিছু সমস্যা সমাধান করে।
return(a,b)[c<d]
মোটামুটি সমান
if c < d:
return b
else:
return a
এ এবং বি উভয়ই প্রথম সংস্করণে মূল্যায়ন করা হয় তবে দ্বিতীয় সংস্করণে নয়।
c<d
True
বা মূল্যায়ন False
।
(a, b)
একটি tuple হয়।
একটি টুপলে ইনডেক্সিং একটি তালিকায় সূচকের মতো কাজ করে: (3,5)[1]
== 5
।
True
সমান 1
এবং False
সমান 0
।
(a,b)[c<d]
(a,b)[True]
(a,b)[1]
b
বা এর জন্য False
:
(a,b)[c<d]
(a,b)[False]
(a,b)[0]
a
কয়েকটি বাইট সংরক্ষণ করার জন্য অজগরকে করতে পারেন এমন অনেক বাজে জিনিসগুলির স্ট্যাক এক্সচেঞ্জ নেটওয়ার্কে একটি ভাল তালিকা রয়েছে। /codegolf/54/tips-for-golfing-in-python
যদিও সাধারণ কোডে এটি কখনই ব্যবহার করা উচিত নয় এবং আপনার ক্ষেত্রে এটির অর্থ x
হ'ল উভয়টিকে এমন কোনও কিছু হিসাবে কাজ করে যা কোনও পূর্ণসংখ্যার সাথে তুলনা করা যেতে পারে এবং কাঁচকে সমর্থন করে এমন একটি ধারক হিসাবে কাজ করে যা খুব অস্বাভাবিক সংমিশ্রণ। এটি সম্ভবত নম্পি কোড, যেমন অন্যরা উল্লেখ করেছে।
Code Golf is the art of writing programs
: ')
সাধারণভাবে এটা মানে হতে পারে কিছু । এটা ইতিমধ্যেই ছিল ব্যাখ্যা এটা মানে কি যদি x
একটি list
বা numpy.ndarray
তবে সাধারণভাবে এটি শুধুমাত্র কিভাবে তুলনা অপারেটরদের (উপর নির্ভর করে <
, >
, ...) এবং কিভাবে / সেট আইটেম ( [...]
-syntax) প্রয়োগ করা হয়।
x.__getitem__(x.__lt__(2)) # this is what x[x < 2] means!
x.__setitem__(x.__lt__(2), 0) # this is what x[x < 2] = 0 means!
কারণ:
x < value
সমতুল্য x.__lt__(value)
x[value]
(মোটামুটি) সমান x.__getitem__(value)
x[value] = othervalue
(এছাড়াও মোটামুটিভাবে) সমতূল্য x.__setitem__(value, othervalue)
।এটি আপনার পছন্দসই কিছু করতে কাস্টমাইজ করা যায় । যেমন একটি উদাহরণ (কিছুটা নমপিস-বুলিয়ান সূচকে নকল করে):
class Test:
def __init__(self, value):
self.value = value
def __lt__(self, other):
# You could do anything in here. For example create a new list indicating if that
# element is less than the other value
res = [item < other for item in self.value]
return self.__class__(res)
def __repr__(self):
return '{0} ({1})'.format(self.__class__.__name__, self.value)
def __getitem__(self, item):
# If you index with an instance of this class use "boolean-indexing"
if isinstance(item, Test):
res = self.__class__([i for i, index in zip(self.value, item) if index])
return res
# Something else was given just try to use it on the value
return self.value[item]
def __setitem__(self, item, value):
if isinstance(item, Test):
self.value = [i if not index else value for i, index in zip(self.value, item)]
else:
self.value[item] = value
সুতরাং এখন দেখা যাক আপনি এটি ব্যবহার করলে কী হয়:
>>> a = Test([1,2,3])
>>> a
Test ([1, 2, 3])
>>> a < 2 # calls __lt__
Test ([True, False, False])
>>> a[Test([True, False, False])] # calls __getitem__
Test ([1])
>>> a[a < 2] # or short form
Test ([1])
>>> a[a < 2] = 0 # calls __setitem__
>>> a
Test ([0, 2, 3])
লক্ষ্য করুন এটি কেবল একটি সম্ভাবনা। আপনি যা চান তার প্রায়োগিক বাস্তবায়ন করতে আপনি নির্দ্বিধায়।