# ============================================================
# Fichier: python_cheats/cheatsheets/comprehensions.txt
# ============================================================

[OK] LIST COMPREHENSION BASIQUE
    # Syntaxe: [expression for item in iterable]
    squares = [x**2 for x in range(10)]
    # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

[OK] AVEC CONDITION (FILTRE)
    # Syntaxe: [expression for item in iterable if condition]
    evens = [x for x in range(20) if x % 2 == 0]
    # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

[OK] AVEC IF-ELSE
    # Syntaxe: [expr_if_true if condition else expr_if_false for item in iterable]
    labels = ['even' if x % 2 == 0 else 'odd' for x in range(5)]
    # ['even', 'odd', 'even', 'odd', 'even']

[OK] IMBRIQUÉE (NESTED)
    # Matrice
    matrix = [[i*j for j in range(3)] for i in range(3)]
    # [[0, 0, 0], [0, 1, 2], [0, 2, 4]]
    
    # Aplatir une liste
    nested = [[1, 2], [3, 4], [5, 6]]
    flat = [item for sublist in nested for item in sublist]
    # [1, 2, 3, 4, 5, 6]

[OK] MANIPULATION DE STRINGS
    words = ['hello', 'world', 'python']
    
    # Majuscules
    upper = [w.upper() for w in words]
    # ['HELLO', 'WORLD', 'PYTHON']
    
    # Longueurs
    lengths = [len(w) for w in words]
    # [5, 5, 6]
    
    # Première lettre
    first_letters = [w[0] for w in words]
    # ['h', 'w', 'p']

[OK] AVEC FONCTIONS
    def square(x):
        return x ** 2
    
    result = [square(x) for x in range(5)]
    # [0, 1, 4, 9, 16]
    
    # Avec lambda
    result = [(lambda x: x**2)(x) for x in range(5)]

[OK] DICT COMPREHENSION BASIQUE
    # Syntaxe: {key_expr: value_expr for item in iterable}
    squares_dict = {x: x**2 for x in range(5)}
    # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

[OK] DICT AVEC CONDITION
    numbers = [1, 2, 3, 4, 5, 6]
    even_squares = {x: x**2 for x in numbers if x % 2 == 0}
    # {2: 4, 4: 16, 6: 36}

[OK] INVERSER UN DICT
    original = {'a': 1, 'b': 2, 'c': 3}
    inverted = {v: k for k, v in original.items()}
    # {1: 'a', 2: 'b', 3: 'c'}

[OK] DICT DEPUIS DEUX LISTES
    keys = ['name', 'age', 'city']
    values = ['Alice', 30, 'Paris']
    person = {k: v for k, v in zip(keys, values)}
    # {'name': 'Alice', 'age': 30, 'city': 'Paris'}

[OK] FILTRER UN DICT
    scores = {'Alice': 85, 'Bob': 72, 'Charlie': 90, 'David': 65}
    passed = {k: v for k, v in scores.items() if v >= 70}
    # {'Alice': 85, 'Bob': 72, 'Charlie': 90}

[OK] TRANSFORMER VALEURS DICT
    prices = {'apple': 1.5, 'banana': 0.8, 'orange': 2.0}
    discounted = {k: v * 0.9 for k, v in prices.items()}
    # {'apple': 1.35, 'banana': 0.72, 'orange': 1.8}

[OK] SET COMPREHENSION
    # Syntaxe: {expression for item in iterable}
    squares_set = {x**2 for x in range(-5, 6)}
    # {0, 1, 4, 9, 16, 25}  (pas de doublons)

[OK] SET AVEC CONDITION
    numbers = [1, 2, 2, 3, 3, 4, 5, 5]
    unique_evens = {x for x in numbers if x % 2 == 0}
    # {2, 4}

[OK] GENERATOR EXPRESSION
    # Comme list comprehension mais avec () au lieu de []
    # Plus efficace en mémoire (lazy evaluation)
    gen = (x**2 for x in range(10))
    
    # Convertir en liste
    list(gen)
    
    # Itérer
    for value in gen:
        print(value)
    
    # Utiliser directement
    sum(x**2 for x in range(10))  # 285

[OK] EXEMPLES PRATIQUES
    # Extraire emails
    users = [
        {'name': 'Alice', 'email': 'alice@mail.com'},
        {'name': 'Bob', 'email': 'bob@mail.com'}
    ]
    emails = [u['email'] for u in users]
    
    # Compter occurrences
    text = "hello world hello python"
    words = text.split()
    word_count = {w: words.count(w) for w in set(words)}
    
    # Filtrer par type
    mixed = [1, 'a', 2, 'b', 3, 'c']
    numbers_only = [x for x in mixed if isinstance(x, int)]
    
    # Coordonnées de grille
    coords = [(x, y) for x in range(3) for y in range(3)]
    # [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)]

[OK] PERFORMANCE
    # List comprehension est plus rapide que for loop
    
    # Lent
    result = []
    for x in range(1000):
        result.append(x**2)
    
    # Rapide
    result = [x**2 for x in range(1000)]
    
    # Très rapide (si on n'a pas besoin de tout en mémoire)
    result = (x**2 for x in range(1000))

[OK] NESTED DICT COMPREHENSION
    # Créer une table de multiplication
    times_table = {
        i: {j: i*j for j in range(1, 6)}
        for i in range(1, 6)
    }
    # {1: {1:1, 2:2, ...}, 2: {1:2, 2:4, ...}, ...}
