DEV Community

ithiria894
ithiria894

Posted on

The Python Survival Guide I Built the Night Before My Assessment

https://ithiria894.github.io/python-field-manual/

You're staring at a timer counting down and your brain goes blank on how to sort a dict by value. This is for that moment.

Everything here is copy-paste ready. No fluff. Just patterns that show up in timed coding assessments over and over.

Dict

d = {}                            # create
d["key"] = "value"                # set
val = d["key"]                    # get (crashes if missing)
val = d.get("key")                # get (returns None if missing)
val = d.get("key", "default")    # get with default
del d["key"]                      # delete
"key" in d                        # check exists

# nested dict
d["user"] = {"balance": 0, "history": []}
d["user"]["balance"] += 100

# loop
for key, value in d.items():
    print(key, value)
Enter fullscreen mode Exit fullscreen mode

List

lst = []                # create
lst.append(x)           # add to end
lst[0]                  # first element
lst[-1]                 # last element
lst[:n]                 # first n items (safe even if n > len)
len(lst)                # length
del lst[i]              # delete by index

for item in reversed(lst):    # loop backwards
    print(item)
Enter fullscreen mode Exit fullscreen mode

Sorting

# basic
sorted(lst)                          # returns new sorted list
lst.sort()                           # sorts in place

# by custom key
sorted(lst, key=lambda x: x[1])      # sort by second element

# multi-criteria: score DESC, name ASC
sorted(items, key=lambda x: (-x[1], x[0]))

# sort dict items by value desc
sorted(d.items(), key=lambda x: -x[1])

# sort list of dicts
users.sort(key=lambda x: (-x["score"], x["name"]))
Enter fullscreen mode Exit fullscreen mode

String

f"{name}({value})"              # format -> "alice(500)"
", ".join(["a", "b", "c"])      # join -> "a, b, c"
s.startswith("prefix")          # True/False
s.split("/")                    # split -> ["path", "to", "file"]
s.strip()                       # remove whitespace from ends
Enter fullscreen mode Exit fullscreen mode

Class

class MySystem:
    def __init__(self):           # two underscores each side
        self.data = {}            # instance variable
        self.counter = 0

    def add(self, key, value):    # every method needs self
        self.data[key] = value

    def get(self, key):
        return self.data.get(key)
Enter fullscreen mode Exit fullscreen mode

Auto-Increment ID

self.counter += 1
item_id = f"item{self.counter}"    # item1, item2, item3...
Enter fullscreen mode Exit fullscreen mode

TTL / Expiry

# store with expiry
self.data[key] = {"value": val, "expiry": timestamp + ttl}

# check alive
entry = self.data[key]
if timestamp < entry["expiry"]:    # alive (exclusive boundary)
    return entry["value"]
Enter fullscreen mode Exit fullscreen mode

Lazy Processing (Scheduled Events)

def _process_pending(self, timestamp):
    for item_id, item in self.pending.items():
        if not item["done"] and timestamp >= item["deadline"]:
            # do the thing
            item["done"] = True

def any_method(self, timestamp, ...):
    self._process_pending(timestamp)    # always first line
    # then do actual work
Enter fullscreen mode Exit fullscreen mode

History Tracking

# append after every state change
acc["history"].append((timestamp, acc["balance"]))

# query historical value
for ts, val in reversed(acc["history"]):
    if ts <= target_time:
        return val
Enter fullscreen mode Exit fullscreen mode

Deep Copy (Backup/Restore)

import copy
snapshot = copy.deepcopy(self.data)    # full independent copy
# changing snapshot won't affect self.data
Enter fullscreen mode Exit fullscreen mode

Bisect (Binary Search in Sorted List)

import bisect

sorted_list = [10, 20, 30, 40, 50]
idx = bisect.bisect_right(sorted_list, 25)    # 2
bisect.insort(sorted_list, 25)                 # [10, 20, 25, 30, 40, 50]
Enter fullscreen mode Exit fullscreen mode

asyncio

import asyncio

# make a function async
async def process(item):
    await asyncio.sleep(0.01)       # simulate I/O
    return item * 2

# run multiple tasks at once
async def main():
    results = await asyncio.gather(*[process(x) for x in items])

asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

asyncio Lock (Protect Shared Data)

lock = asyncio.Lock()

async def safe_update(account, amount):
    async with lock:                # only one at a time
        account["balance"] += amount
Enter fullscreen mode Exit fullscreen mode

asyncio Semaphore (Limit Concurrency)

sem = asyncio.Semaphore(3)          # max 3 concurrent

async def limited_task(item):
    async with sem:
        await do_work(item)

# all start but only 3 run at once
await asyncio.gather(*[limited_task(x) for x in items])
Enter fullscreen mode Exit fullscreen mode

defaultdict

from collections import defaultdict

groups = defaultdict(list)       # missing key -> empty list
groups["team_a"].append("alice") # no need to check if key exists

counts = defaultdict(int)        # missing key -> 0
counts["errors"] += 1
Enter fullscreen mode Exit fullscreen mode

Gotchas

# DON'T modify dict while iterating
for key in d:
    del d[key]           # RuntimeError!
# DO this instead
to_delete = [k for k in d if should_delete(k)]
for k in to_delete:
    del d[k]

# DON'T forget self
def method(account_id):          # WRONG, missing self
def method(self, account_id):    # RIGHT

# DON'T use dot on dicts
d.balance                        # WRONG (that's for classes)
d["balance"]                     # RIGHT

# DON'T confuse shallow and deep copy
copy_ref = original              # same object, not a copy!
import copy
real_copy = copy.deepcopy(original)   # independent copy
Enter fullscreen mode Exit fullscreen mode

That's it. Bookmark this page. You'll need it at 3am.

Top comments (0)