# Python Basic

## 使用Custom Comparator

使用cmp\_to\_key

```python
from functools import cmp_to_key
def compare(item1, item2):
    return item1 - item2
    
mylist.sort(key=cmp_to_key(compare))

# Or
from functools import cmp_to_key
mylist.sort(key=cmp_to_key(
    lambda item1, item2: len(item1) - len(item2)
                            # str compare 只能用 > <
                            # str a < b 只會返回 true false
    if item1 == item2 else (-1 if item1<item2 else 1)))
```

如果比較物件不是primitive type，可以用一個wrapper class 實作 lt

```python
class ListNode:
    def __init__(self, x):
         self.val = x
         self.next = None
     
class Wrapper():
    def __init__(self, node):
        self.node = node
    def __lt__(self, other):
        return self.node.val < other.node.val
```

## frozenset()使用

The **`frozenset()`** is an inbuilt function is Python which takes an iterable object as input and makes them immutable. Since frozenset object are immutable they are mainly used as key in dictionary or elements of other sets

### 694 Number of Distinct Islands

尋找地圖中圖型pattern distinct的個數

1. dfs中紀錄原始座標，並在set中紀錄相對座標

```python
def numDistinctIslands(self, grid: List[List[int]]) -> int:
    self.m, self.n = len(grid), len(grid[0])
    shapes = set()
    for i in range(self.m):
        for j in range(self.n):
            if grid[i][j] == 1:
                shape = set()
                self.helper(grid, shape, i, j, i, j)
                shape = frozenset(shape)
                if shape not in shapes:
                    shapes.add(shape)
    return len(shapes)


def helper(self, grid, shape, i, j, i0, j0):
    grid[i][j] = 0
    shape.add((i-i0, j-j0))
    for dy, dx in ((0, 1),(1, 0), (0, -1), (-1, 0)):
        y = i + dy
        x = j + dx
        if not (0 <= y < self.m and 0 <= x < self.n and grid[y][x] == 1): continue
        self.helper(grid, shape, y, x, i0, j0)
        
```

## zfill

補0

```python
s = 'abc'
s = zfill(6)
# s = '000abc'
```

## frozenset()

將iterable 變成 hashable

### 694. Number of Distinct Islands

```python
def numDistinctIslands(self, grid: List[List[int]]) -> int:
    self.m, self.n = len(grid), len(grid[0])
    shapes = set()
    for i in range(self.m):
        for j in range(self.n):
            if grid[i][j] == 1:
                shape = set()
                self.helper(grid, shape, i, j, i, j)
                shape = frozenset(shape)
                if shape not in shapes:
                    shapes.add(shape)
    return len(shapes)


def helper(self, grid, shape, i, j, i0, j0):
    grid[i][j] = 0
    shape.add((i-i0, j-j0))
    for dy, dx in ((0, 1),(1, 0), (0, -1), (-1, 0)):
        y = i + dy
        x = j + dx
        if not (0 <= y < self.m and 0 <= x < self.n and grid[y][x] == 1): continue
        self.helper(grid, shape, y, x, i0, j0)
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://netjimmy.gitbook.io/code-interview-note/basic/python-basic.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
