# Key, value, one line.
# dict comprehensions — build, transform, filter

# ─────────────────────────────────────────────
# Basic syntax — {key: value for item in iterable}
# ─────────────────────────────────────────────

squares = {n: n ** 2 for n in range(1, 6)}
print(squares)
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# ─────────────────────────────────────────────
# From a list — build a lookup dict
# ─────────────────────────────────────────────

names = ["Raven", "Wolf", "Ghost", "Viper"]

lengths  = {name: len(name) for name in names}
lowered  = {name: name.lower() for name in names}
indexed  = {i: name for i, name in enumerate(names)}

print(lengths)  # {'Raven': 5, 'Wolf': 4, 'Ghost': 5, 'Viper': 5}
print(lowered)  # {'Raven': 'raven', 'Wolf': 'wolf', ...}
print(indexed)  # {0: 'Raven', 1: 'Wolf', 2: 'Ghost', 3: 'Viper'}

# ─────────────────────────────────────────────
# Transform values in an existing dict
# ─────────────────────────────────────────────

scores = {"Raven": 85, "Wolf": 74, "Ghost": 91}

# add bonus to every score
boosted = {name: score + 5 for name, score in scores.items()}
print(boosted)
# {'Raven': 90, 'Wolf': 79, 'Ghost': 96}

# pass/fail label
status = {name: "passed" if score >= 80 else "failed"
          for name, score in scores.items()}
print(status)
# {'Raven': 'passed', 'Wolf': 'failed', 'Ghost': 'passed'}

# ─────────────────────────────────────────────
# Filter key-value pairs
# ─────────────────────────────────────────────

scores = {"Raven": 85, "Wolf": 74, "Ghost": 91, "Viper": 63}

passing = {name: score for name, score in scores.items() if score >= 80}
failing = {name: score for name, score in scores.items() if score < 80}

print(passing)  # {'Raven': 85, 'Ghost': 91}
print(failing)  # {'Wolf': 74, 'Viper': 63}

# ─────────────────────────────────────────────
# Swap keys and values
# ─────────────────────────────────────────────

original = {"Raven": 85, "Wolf": 74, "Ghost": 91}
swapped  = {score: name for name, score in original.items()}
print(swapped)
# {85: 'Raven', 74: 'Wolf', 91: 'Ghost'}

# only works cleanly when values are unique
# duplicate values → last one wins, others lost

# ─────────────────────────────────────────────
# From two lists with zip()
# ─────────────────────────────────────────────

names  = ["Raven", "Wolf", "Ghost"]
scores = [85, 74, 91]

result = {name: score for name, score in zip(names, scores)}
print(result)
# {'Raven': 85, 'Wolf': 74, 'Ghost': 91}

# same as dict(zip(names, scores)) — but more flexible for transformations
boosted = {name: score + 5 for name, score in zip(names, scores)}
print(boosted)
# {'Raven': 90, 'Wolf': 79, 'Ghost': 96}

# ─────────────────────────────────────────────
# Quick reference
# ─────────────────────────────────────────────

# {k: v for x in iterable}              — build from iterable
# {k: v for k, v in d.items()}          — transform existing dict
# {k: v for k, v in d.items() if cond}  — filter existing dict
# {v: k for k, v in d.items()}          — swap keys and values
# {k: v for k, v in zip(keys, values)}  — build from two lists
#
# duplicate keys → last value wins
# if goes after the for — not before
# use .items() when looping over an existing dict
