python - क्या पायथन में `बोर्ड[x, y]` और `बोर्ड[x][y]` के बीच अंतर है?




arrays list (4)

मैं GeekforGeeks वेबसाइट पर एक ट्यूटोरियल के माध्यम से काम कर रहा हूं और देखा है कि वे board[x,y] का उपयोग करके एक सरणी में एक बिंदु की जांच कर रहे हैं, जो मैंने पहले कभी नहीं देखा है। मुझे नहीं लगता कि यह काम करेगा, लेकिन जब मैं कार्यक्रम चलाता हूं, तो सब कुछ उम्मीद के मुताबिक होता है।

मैंने उनके विधि के ऊपर उल्लिखित विधि का उपयोग करके एक छोटा कोड उदाहरण चलाने की कोशिश की, जिस विधि ( board[x][y] ) से मैं अधिक परिचित हूं, लेकिन जब मैं अपना कोड चलाता हूं, तो मुझे TypeError: list indices must be integers or slices, not tuple

मेरा कोड:

board = [[1,1,1], [1,2,2], [1,2,2]]
win = 'True'

if board[1][1] == 2:
    win = 'True by normal standards'
    print(win)
if board[1, 1] == 2:
    win = 'True by weird standards'
    print(win)

print(win)

उनका कोड:

def row_win(board, player): 
    for x in range(len(board)): 
        win = True

        for y in range(len(board)): 
            if board[x, y] != player: 
                win = False
                continue

        if win == True: 
            return(win) 
    return(win) 

क्या कोई मुझे समझा सकता है कि board[x,y] क्यों board[x,y] काम करता है, और वास्तव में क्या हो रहा है? सूची बनाने के अलावा मैंने इसे पहले कभी नहीं देखा है, और इसे वैचारिक रूप से नहीं समझ रहा हूं।


अजगर में, [] __getitem__ , जिसे आसानी से फिर से लिखा जा सकता है।

और, अजगर में 1, 2 हमें एक टपल देगा। हां, हमें एक खाली खाली टुप बनाने के लिए वास्तव में () आवश्यकता नहीं है।

तो, Numpy यह बहुत आसानी से कर सकता है, यहां तक ​​कि मैं भी कर सकता हूं।

In [1]: 1, 1
Out[1]: (1, 1)

In [2]: type(_)
Out[2]: tuple

In [3]: a = {(1, 1): 3}

In [4]: a[1, 1]
Out[4]: 3

In [5]: a[(1, 1)]
Out[5]: 3

In [6]: class NumpyArray(list):
   ...:     def __getitem__(self, index):
   ...:         if isinstance(index, tuple) and len(index) == 2:
   ...:             return self[index[0]][index[1]]
   ...:         return super().__getitem__(index)
   ...:

In [7]: b = NumpyArray([[0, 1], [2, 3]])

In [8]: b[1, 1]
Out[8]: 3

अपने खुद के iPython पर प्रयास करने के लिए आप नीचे दिए गए कोड का उपयोग कर सकते हैं।

class NumpyArray(list):
    def __getitem__(self, index):
        if isinstance(index, tuple) and len(index) == 2:
            return self[index[0]][index[1]]
        return super().__getitem__(index)

b = NumpyArray([[0, 1], [2, 3]])
b[1, 1]

यह वास्तव में बेस पायथन (आपके उदाहरण की तरह) में काम नहीं करता है। यदि आप अपना कोड चलाते हैं, तो Python एक अपवाद फेंकता है: 'TypeError: सूची सूचकांकों को पूर्णांक या स्लाइस होना चाहिए, न कि टपल।'

board में उत्तीर्ण 1, 1 की व्याख्या टपल के रूप में की जाती है और चूंकि बोर्ड को पूर्णांक या स्लाइस के साथ अनुक्रमित किया जाना चाहिए, यह काम नहीं करेगा।

हालाँकि, यदि board कुछ प्रकार की सरणी जैसी डेटा संरचना थे और डेवलपर ने ट्यूपल्स के साथ अनुक्रमण के लिए समर्थन लागू किया था, तो यह काम करेगा। इसका एक उदाहरण numpy में arrays है।


वे ऐसा करने में सक्षम हैं क्योंकि वे NumPy का उपयोग कर रहे हैं, जो उस पर कोई त्रुटि नहीं फेंकेंगे।

>>> a = np.array([[1,1,1], [1,2,2], [1,2,2]])
>>> a[1,1]
2
>>> # equivalent to
>>> a = [[1,1,1], [1,2,2], [1,2,2]]
>>> a[1][1]
2
>>> 

board[x, y] सिंटैक्स को संभवतः एक अफीम सरणी पर लागू किया जा रहा है, जो पंक्ति / स्तंभ अनुक्रमित स्लाइसिंग संचालन को लागू करने के लिए इस सिंटैक्स को स्वीकार करता है। इन उदाहरणों पर एक नज़र डालें:

>>> x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  # creates 2D array
>>> x
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

>>> x[1]  # get second row (remember, index starts at 0)
array([4, 5, 6])

>>> x[:, 2]  # get third column
array([3, 6, 9])

>>> x[1, 2]  # get element on second row, third column
6

>>> x[1][2]  # same as before but with non-broadcasting syntax (i.e. works for lists as you are used to)
6

>>> x[1, 0:2]  # get first two elements of second row  
array([4, 5])

>>> x[0:2, 0:2]  # subsets the original array, "extracting" values from the first two columns/rows only
array([[1, 2],
       [4, 5]])

बेशक, my_list[x, y] लिखते my_list[x, y] एक त्रुटि होती है क्योंकि x, y वास्तव में एक ट्यूपल (x, y) , और नियमित सूचियाँ tuples के साथ अनुक्रमण मान के रूप में काम नहीं कर सकती हैं।





indexing