Exemples de Structures de Données Web Python

Exemples de structures de données Web Python incluant les opérations de tableau, tables de hachage et listes chaînées

Key Facts

Category
Python
Items
3
Format Families
sample

Sample Overview

Exemples de structures de données Web Python incluant les opérations de tableau, tables de hachage et listes chaînées This sample set belongs to Python and can be used to test related workflows inside Elysia Tools.

💻 Opérations de Tableau python

🟢 simple ⭐⭐

Effectuer des opérations de tableau/liste incluant CRUD, tri, recherche et transformations

⏱️ 30 min 🏷️ python, web, data structures, arrays
Prerequisites: Basic Python, Lists
# Web Python Array Operations Examples
# Using Python lists for array operations with comprehensive CRUD functionality

# 1. Basic Array/List Operations
from typing import List, Any, Optional, Callable
import bisect

def create_array(elements: List[Any] = None) -> List[Any]:
    """
    Create a new array (list)

    Args:
        elements: Initial elements

    Returns:
        New list
    """
    return elements.copy() if elements else []

def add_element(array: List[Any], element: Any, position: Optional[int] = None) -> List[Any]:
    """
    Add element to array

    Args:
        array: Target array
        element: Element to add
        position: Position to insert (None = append)

    Returns:
        Modified array
    """
    if position is None:
        array.append(element)
    else:
        array.insert(position, element)
    return array

def remove_element(array: List[Any], element: Any) -> bool:
    """
    Remove element from array

    Args:
        array: Target array
        element: Element to remove

    Returns:
        True if removed
    """
    try:
        array.remove(element)
        return True
    except ValueError:
        return False

def remove_at(array: List[Any], index: int) -> Any:
    """
    Remove element at index

    Args:
        array: Target array
        index: Index to remove

    Returns:
        Removed element
    """
    if 0 <= index < len(array):
        return array.pop(index)
    return None

def get_element(array: List[Any], index: int) -> Any:
    """
    Get element at index

    Args:
        array: Target array
        index: Index to get

    Returns:
        Element at index
    """
    return array[index] if 0 <= index < len(array) else None

def update_element(array: List[Any], index: int, new_value: Any) -> bool:
    """
    Update element at index

    Args:
        array: Target array
        index: Index to update
        new_value: New value

    Returns:
        True if updated
    """
    if 0 <= index < len(array):
        array[index] = new_value
        return True
    return False

def find_index(array: List[Any], element: Any) -> int:
    """
    Find index of element

    Args:
        array: Target array
        element: Element to find

    Returns:
        Index or -1 if not found
    """
    try:
        return array.index(element)
    except ValueError:
        return -1

def contains(array: List[Any], element: Any) -> bool:
    """
    Check if array contains element

    Args:
        array: Target array
        element: Element to check

    Returns:
        True if contains
    """
    return element in array

def get_size(array: List[Any]) -> int:
    """
    Get array size

    Args:
        array: Target array

    Returns:
        Array length
    """
    return len(array)

def is_empty(array: List[Any]) -> bool:
    """
    Check if array is empty

    Args:
        array: Target array

    Returns:
        True if empty
    """
    return len(array) == 0

def clear_array(array: List[Any]) -> List[Any]:
    """
    Clear all elements

    Args:
        array: Target array

    Returns:
        Empty array
    """
    array.clear()
    return array

# 2. Sorting Operations
def bubble_sort(array: List[Any], key: Optional[Callable] = None, reverse: bool = False) -> List[Any]:
    """
    Bubble sort algorithm

    Args:
        array: Array to sort
        key: Sort key function
        reverse: Sort descending

    Returns:
        Sorted array
    """
    arr = array.copy()
    n = len(arr)

    for i in range(n):
        for j in range(0, n - i - 1):
            if key:
                a, b = key(arr[j]), key(arr[j + 1])
            else:
                a, b = arr[j], arr[j + 1]

            if reverse:
                should_swap = a < b
            else:
                should_swap = a > b

            if should_swap:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

    return arr

def quick_sort(array: List[Any], key: Optional[Callable] = None, reverse: bool = False) -> List[Any]:
    """
    Quick sort algorithm

    Args:
        array: Array to sort
        key: Sort key function
        reverse: Sort descending

    Returns:
        Sorted array
    """
    if len(array) <= 1:
        return array

    pivot = array[len(array) // 2]

    if key:
        pivot_value = key(pivot)
    else:
        pivot_value = pivot

    left = [x for x in array if (key(x) if key else x) < pivot_value]
    middle = [x for x in array if (key(x) if key else x) == pivot_value]
    right = [x for x in array if (key(x) if key else x) > pivot_value]

    if reverse:
        return quick_sort(right, key, reverse) + middle + quick_sort(left, key, reverse)
    else:
        return quick_sort(left, key, reverse) + middle + quick_sort(right, key, reverse)

def merge_sort(array: List[Any], key: Optional[Callable] = None, reverse: bool = False) -> List[Any]:
    """
    Merge sort algorithm

    Args:
        array: Array to sort
        key: Sort key function
        reverse: Sort descending

    Returns:
        Sorted array
    """
    if len(array) <= 1:
        return array

    mid = len(array) // 2
    left = merge_sort(array[:mid], key, reverse)
    right = merge_sort(array[mid:], key, reverse)

    return merge(left, right, key, reverse)

def merge(left: List[Any], right: List[Any], key: Optional[Callable], reverse: bool) -> List[Any]:
    """Merge two sorted arrays"""
    result = []
    i = j = 0

    while i < len(left) and j < len(right):
        left_val = key(left[i]) if key else left[i]
        right_val = key(right[j]) if key else right[j]

        if reverse:
            condition = left_val >= right_val
        else:
            condition = left_val <= right_val

        if condition:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    result.extend(left[i:])
    result.extend(right[j:])
    return result

def sort_array(array: List[Any], key: Optional[Callable] = None, reverse: bool = False, algorithm: str = 'builtin') -> List[Any]:
    """
    Sort array using specified algorithm

    Args:
        array: Array to sort
        key: Sort key function
        reverse: Sort descending
        algorithm: 'builtin', 'bubble', 'quick', 'merge'

    Returns:
        Sorted array
    """
    if algorithm == 'bubble':
        return bubble_sort(array, key, reverse)
    elif algorithm == 'quick':
        return quick_sort(array, key, reverse)
    elif algorithm == 'merge':
        return merge_sort(array, key, reverse)
    else:
        return sorted(array, key=key, reverse=reverse)

# 3. Searching Operations
def linear_search(array: List[Any], target: Any, key: Optional[Callable] = None) -> int:
    """
    Linear search

    Args:
        array: Array to search
        target: Target value
        key: Key function for comparison

    Returns:
        Index or -1 if not found
    """
    for i, element in enumerate(array):
        value = key(element) if key else element
        if value == target:
            return i
    return -1

def binary_search(array: List[Any], target: Any, key: Optional[Callable] = None) -> int:
    """
    Binary search (requires sorted array)

    Args:
        array: Sorted array to search
        target: Target value
        key: Key function for comparison

    Returns:
        Index or -1 if not found
    """
    left, right = 0, len(array) - 1

    while left <= right:
        mid = (left + right) // 2
        mid_value = key(array[mid]) if key else array[mid]

        if mid_value == target:
            return mid
        elif mid_value < target:
            left = mid + 1
        else:
            right = mid - 1

    return -1

def find_all(array: List[Any], target: Any, key: Optional[Callable] = None) -> List[int]:
    """
    Find all occurrences

    Args:
        array: Array to search
        target: Target value
        key: Key function for comparison

    Returns:
        List of indices
    """
    indices = []
    for i, element in enumerate(array):
        value = key(element) if key else element
        if value == target:
            indices.append(i)
    return indices

def find_min(array: List[Any], key: Optional[Callable] = None) -> Any:
    """
    Find minimum element

    Args:
        array: Array to search
        key: Key function for comparison

    Returns:
        Minimum element
    """
    if not array:
        return None
    return min(array, key=key) if key else min(array)

def find_max(array: List[Any], key: Optional[Callable] = None) -> Any:
    """
    Find maximum element

    Args:
        array: Array to search
        key: Key function for comparison

    Returns:
        Maximum element
    """
    if not array:
        return None
    return max(array, key=key) if key else max(array)

# 4. Transformation Operations
def map_array(array: List[Any], func: Callable[[Any], Any]) -> List[Any]:
    """
    Apply function to all elements

    Args:
        array: Source array
        func: Transform function

    Returns:
        New array
    """
    return [func(x) for x in array]

def filter_array(array: List[Any], predicate: Callable[[Any], bool]) -> List[Any]:
    """
    Filter elements by predicate

    Args:
        array: Source array
        predicate: Filter function

    Returns:
        Filtered array
    """
    return [x for x in array if predicate(x)]

def reduce_array(array: List[Any], func: Callable[[Any, Any], Any], initial: Any = None) -> Any:
    """
    Reduce array to single value

    Args:
        array: Source array
        func: Reduce function
        initial: Initial value

    Returns:
        Reduced value
    """
    if initial is not None:
        result = initial
        for x in array:
            result = func(result, x)
    else:
        result = array[0]
        for x in array[1:]:
            result = func(result, x)
    return result

def flatten_array(array: List[Any]) -> List[Any]:
    """
    Flatten nested array

    Args:
        array: Nested array

    Returns:
        Flattened array
    """
    result = []
    for element in array:
        if isinstance(element, list):
            result.extend(flatten_array(element))
        else:
            result.append(element)
    return result

def chunk_array(array: List[Any], size: int) -> List[List[Any]]:
    """
    Split array into chunks

    Args:
        array: Source array
        size: Chunk size

    Returns:
        List of chunks
    """
    return [array[i:i + size] for i in range(0, len(array), size)]

# 5. Advanced Operations
def rotate_array(array: List[Any], positions: int) -> List[Any]:
    """
    Rotate array

    Args:
        array: Source array
        positions: Positions to rotate (positive = right)

    Returns:
        Rotated array
    """
    if not array:
        return array

    positions = positions % len(array)
    return array[-positions:] + array[:-positions]

def reverse_array(array: List[Any]) -> List[Any]:
    """
    Reverse array

    Args:
        array: Source array

    Returns:
        Reversed array
    """
    return array[::-1]

def shuffle_array(array: List[Any]) -> List[Any]:
    """
    Shuffle array randomly

    Args:
        array: Source array

    Returns:
        Shuffled array
    """
    import random
    result = array.copy()
    random.shuffle(result)
    return result

def unique_array(array: List[Any], key: Optional[Callable] = None) -> List[Any]:
    """
    Get unique elements

    Args:
        array: Source array
        key: Key function for uniqueness

    Returns:
        Unique elements
    """
    if key:
        seen = set()
        result = []
        for item in array:
            k = key(item)
            if k not in seen:
                seen.add(k)
                result.append(item)
        return result
    else:
        return list(dict.fromkeys(array))

def intersect_arrays(arr1: List[Any], arr2: List[Any]) -> List[Any]:
    """
    Find intersection of two arrays

    Args:
        arr1: First array
        arr2: Second array

    Returns:
        Intersection
    """
    return list(set(arr1) & set(arr2))

def union_arrays(arr1: List[Any], arr2: List[Any]) -> List[Any]:
    """
    Find union of two arrays

    Args:
        arr1: First array
        arr2: Second array

    Returns:
        Union
    """
    return list(set(arr1) | set(arr2))

def difference_arrays(arr1: List[Any], arr2: List[Any]) -> List[Any]:
    """
    Find difference of two arrays

    Args:
        arr1: First array
        arr2: Second array

    Returns:
        Difference
    """
    return list(set(arr1) - set(arr2))

# 6. Statistical Operations
def sum_array(array: List[float]) -> float:
    """Calculate sum of array"""
    return sum(array)

def mean_array(array: List[float]) -> float:
    """Calculate mean of array"""
    return sum(array) / len(array) if array else 0

def median_array(array: List[float]) -> float:
    """Calculate median of array"""
    if not array:
        return 0

    sorted_arr = sorted(array)
    n = len(sorted_arr)
    mid = n // 2

    if n % 2 == 0:
        return (sorted_arr[mid - 1] + sorted_arr[mid]) / 2
    else:
        return sorted_arr[mid]

def mode_array(array: List[Any]) -> Any:
    """Calculate mode of array"""
    from collections import Counter
    if not array:
        return None

    counter = Counter(array)
    return counter.most_common(1)[0][0]

def std_deviation(array: List[float]) -> float:
    """Calculate standard deviation"""
    import math
    if len(array) < 2:
        return 0

    mean = mean_array(array)
    variance = sum((x - mean) ** 2 for x in array) / len(array)
    return math.sqrt(variance)

# Usage Examples
def demonstrate_array_operations():
    print("=== Web Python Array Operations Examples ===\n")

    # 1. Basic operations
    print("--- 1. Basic Operations ---")
    arr = create_array([3, 1, 4, 1, 5])
    print(f"Created: {arr}")
    add_element(arr, 9)
    print(f"After append: {arr}")
    add_element(arr, 2, position=0)
    print(f"After insert at 0: {arr}")
    print(f"Size: {get_size(arr)}")

    # 2. Sorting
    print("\n--- 2. Sorting ---")
    unsorted = [64, 34, 25, 12, 22, 11, 90]
    print(f"Original: {unsorted}")
    print(f"Bubble sort: {bubble_sort(unsorted.copy())}")
    print(f"Quick sort: {quick_sort(unsorted.copy())}")
    print(f"Builtin sort: {sort_array(unsorted.copy())}")

    # 3. Searching
    print("\n--- 3. Searching ---")
    data = [1, 3, 5, 7, 9, 11, 13]
    print(f"Array: {data}")
    print(f"Linear search for 7: {linear_search(data, 7)}")
    print(f"Binary search for 7: {binary_search(data, 7)}")
    print(f"Find all 1s: {find_all([1, 2, 1, 3, 1], 1)}")

    # 4. Transformations
    print("\n--- 4. Transformations ---")
    numbers = [1, 2, 3, 4, 5]
    print(f"Original: {numbers}")
    print(f"Map (x^2): {map_array(numbers, lambda x: x ** 2)}")
    print(f"Filter (even): {filter_array(numbers, lambda x: x % 2 == 0)}")
    print(f"Reduce (sum): {reduce_array(numbers, lambda a, b: a + b, 0)}")
    print(f"Flatten: {flatten_array([1, [2, 3], [4, [5]]])}")

    # 5. Advanced operations
    print("\n--- 5. Advanced Operations ---")
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print(f"Original: {data}")
    print(f"Rotate 3: {rotate_array(data, 3)}")
    print(f"Reverse: {reverse_array(data)}")
    print(f"Unique: {unique_array([1, 2, 2, 3, 3, 3, 4])}")
    print(f"Chunk size 3: {chunk_array(data, 3)}")

    # 6. Statistical
    print("\n--- 6. Statistical Operations ---")
    numbers = [2, 4, 4, 4, 5, 5, 7, 9]
    print(f"Data: {numbers}")
    print(f"Sum: {sum_array(numbers)}")
    print(f"Mean: {mean_array(numbers):.2f}")
    print(f"Median: {median_array(numbers)}")
    print(f"Mode: {mode_array(numbers)}")
    print(f"Std deviation: {std_deviation(numbers):.2f}")

    print("\n=== All Array Operations Examples Completed ===")

# Export functions
# export { create_array, add_element, remove_element, remove_at, get_element, update_element }
# export { find_index, contains, get_size, is_empty, clear_array }
# export { bubble_sort, quick_sort, merge_sort, sort_array }
# export { linear_search, binary_search, find_all, find_min, find_max }
# export { map_array, filter_array, reduce_array, flatten_array, chunk_array }
# export { rotate_array, reverse_array, shuffle_array, unique_array }
# export { intersect_arrays, union_arrays, difference_arrays }
# export { sum_array, mean_array, median_array, mode_array, std_deviation }
# export { demonstrate_array_operations }

💻 Table de Hachage python

🟡 intermediate ⭐⭐⭐

Implémenter et utiliser des tables de hachage (dictionnaires) pour le stockage et la recherche clé-valeur

⏱️ 25 min 🏷️ python, web, data structures, hash table
Prerequisites: Intermediate Python, Dictionaries
# Web Python Hash Table Examples
# Using Python dictionaries for key-value storage and efficient lookups

# 1. Basic Dictionary Operations
from typing import Any, Dict, List, Optional, Callable

def create_hash_table(elements: Dict[Any, Any] = None) -> Dict[Any, Any]:
    """
    Create a new hash table (dictionary)

    Args:
        elements: Initial key-value pairs

    Returns:
        New dictionary
    """
    return elements.copy() if elements else {}

def put(ht: Dict[Any, Any], key: Any, value: Any) -> None:
    """
    Add or update key-value pair

    Args:
        ht: Hash table
        key: Key
        value: Value
    """
    ht[key] = value

def get(ht: Dict[Any, Any], key: Any, default: Any = None) -> Any:
    """
    Get value by key

    Args:
        ht: Hash table
        key: Key to lookup
        default: Default value if key not found

    Returns:
        Value or default
    """
    return ht.get(key, default)

def remove(ht: Dict[Any, Any], key: Any) -> bool:
    """
    Remove key-value pair

    Args:
        ht: Hash table
        key: Key to remove

    Returns:
        True if removed
    """
    if key in ht:
        del ht[key]
        return True
    return False

def contains_key(ht: Dict[Any, Any], key: Any) -> bool:
    """
    Check if key exists

    Args:
        ht: Hash table
        key: Key to check

    Returns:
        True if key exists
    """
    return key in ht

def contains_value(ht: Dict[Any, Any], value: Any) -> bool:
    """
    Check if value exists

    Args:
        ht: Hash table
        value: Value to check

    Returns:
        True if value exists
    """
    return value in ht.values()

def get_size(ht: Dict[Any, Any]) -> int:
    """
    Get hash table size

    Args:
        ht: Hash table

    Returns:
        Number of key-value pairs
    """
    return len(ht)

def is_empty(ht: Dict[Any, Any]) -> bool:
    """
    Check if hash table is empty

    Args:
        ht: Hash table

    Returns:
        True if empty
    """
    return len(ht) == 0

def clear_hash_table(ht: Dict[Any, Any]) -> None:
    """
    Clear all entries

    Args:
        ht: Hash table
    """
    ht.clear()

def get_keys(ht: Dict[Any, Any]) -> List[Any]:
    """
    Get all keys

    Args:
        ht: Hash table

    Returns:
        List of keys
    """
    return list(ht.keys())

def get_values(ht: Dict[Any, Any]) -> List[Any]:
    """
    Get all values

    Args:
        ht: Hash table

    Returns:
        List of values
    """
    return list(ht.values())

def get_items(ht: Dict[Any, Any]) -> List[tuple]:
    """
    Get all key-value pairs

    Args:
        ht: Hash table

    Returns:
        List of tuples
    """
    return list(ht.items())

# 2. Advanced Operations
def update_hash_table(ht: Dict[Any, Any], other: Dict[Any, Any]) -> None:
    """
    Update with another dictionary

    Args:
        ht: Target hash table
        other: Source dictionary
    """
    ht.update(other)

def merge_hash_tables(ht1: Dict[Any, Any], ht2: Dict[Any, Any]) -> Dict[Any, Any]:
    """
    Merge two hash tables

    Args:
        ht1: First hash table
        ht2: Second hash table

    Returns:
        Merged hash table
    """
    result = ht1.copy()
    result.update(ht2)
    return result

def set_default(ht: Dict[Any, Any], key: Any, default: Any) -> Any:
    """
    Set default value if key doesn't exist

    Args:
        ht: Hash table
        key: Key
        default: Default value

    Returns:
        Value (existing or default)
    """
    return ht.setdefault(key, default)

def pop_value(ht: Dict[Any, Any], key: Any, default: Any = None) -> Any:
    """
    Remove and return value

    Args:
        ht: Hash table
        key: Key
        default: Default if key not found

    Returns:
        Removed value or default
    """
    return ht.pop(key, default)

def pop_item(ht: Dict[Any, Any]) -> tuple:
    """
    Remove and return arbitrary item

    Args:
        ht: Hash table

    Returns:
        (key, value) tuple
    """
    return ht.popitem()

# 3. Dictionary Comprehensions
def create_from_keys(keys: List[Any], value: Any) -> Dict[Any, Any]:
    """
    Create dict from keys with same value

    Args:
        keys: List of keys
        value: Value for all keys

    Returns:
        Dictionary
    """
    return {key: value for key in keys}

def create_from_mapping(keys: List[Any], func: Callable[[Any], Any]) -> Dict[Any, Any]:
    """
    Create dict by mapping keys through function

    Args:
        keys: List of keys
        func: Function to generate values

    Returns:
        Dictionary
    """
    return {key: func(key) for key in keys}

def filter_hash_table(ht: Dict[Any, Any], predicate: Callable[[tuple], bool]) -> Dict[Any, Any]:
    """
    Filter entries by predicate

    Args:
        ht: Hash table
        predicate: Filter function

    Returns:
        Filtered dictionary
    """
    return {k: v for k, v in ht.items() if predicate((k, v))}

def invert_hash_table(ht: Dict[Any, Any]) -> Dict[Any, Any]:
    """
    Invert key-value pairs

    Args:
        ht: Hash table

    Returns:
        Inverted dictionary
    """
    return {v: k for k, v in ht.items()}

# 4. Sorting Operations
def sort_by_keys(ht: Dict[Any, Any], reverse: bool = False) -> List[tuple]:
    """
    Sort entries by keys

    Args:
        ht: Hash table
        reverse: Sort descending

    Returns:
        Sorted list of tuples
    """
    return sorted(ht.items(), key=lambda x: x[0], reverse=reverse)

def sort_by_values(ht: Dict[Any, Any], reverse: bool = False) -> List[tuple]:
    """
    Sort entries by values

    Args:
        ht: Hash table
        reverse: Sort descending

    Returns:
        Sorted list of tuples
    """
    return sorted(ht.items(), key=lambda x: x[1], reverse=reverse)

def get_sorted_keys(ht: Dict[Any, Any], reverse: bool = False) -> List[Any]:
    """Get sorted keys"""
    return sorted(ht.keys(), reverse=reverse)

def get_sorted_values(ht: Dict[Any, Any], reverse: bool = False) -> List[Any]:
    """Get sorted values"""
    return sorted(ht.values(), reverse=reverse)

# 5. Lookup Operations
def find_keys_by_value(ht: Dict[Any, Any], value: Any) -> List[Any]:
    """
    Find all keys with given value

    Args:
        ht: Hash table
        value: Value to search

    Returns:
        List of keys
    """
    return [k for k, v in ht.items() if v == value]

def find_max_value(ht: Dict[Any, Any]) -> tuple:
    """
    Find entry with maximum value

    Args:
        ht: Hash table

    Returns:
        (key, value) tuple
    """
    return max(ht.items(), key=lambda x: x[1])

def find_min_value(ht: Dict[Any, Any]) -> tuple:
    """
    Find entry with minimum value

    Args:
        ht: Hash table

    Returns:
        (key, value) tuple
    """
    return min(ht.items(), key=lambda x: x[1])

# 6. Hash Table Utilities
def copy_hash_table(ht: Dict[Any, Any]) -> Dict[Any, Any]:
    """
    Create shallow copy

    Args:
        ht: Hash table

    Returns:
        Copy
    """
    return ht.copy()

def deep_copy_hash_table(ht: Dict[Any, Any]) -> Dict[Any, Any]:
    """
    Create deep copy

    Args:
        ht: Hash table

    Returns:
        Deep copy
    """
    import copy
    return copy.deepcopy(ht)

def to_string(ht: Dict[Any, Any], indent: int = 0) -> str:
    """
    Convert to formatted string

    Args:
        ht: Hash table
        indent: Indentation level

    Returns:
        Formatted string
    """
    import json
    return json.dumps(ht, indent=indent, default=str)

def from_tuples(items: List[tuple]) -> Dict[Any, Any]:
    """
    Create dict from list of tuples

    Args:
        items: List of (key, value) tuples

    Returns:
        Dictionary
    """
    return dict(items)

def from_lists(keys: List[Any], values: List[Any]) -> Dict[Any, Any]:
    """
    Create dict from two lists

    Args:
        keys: List of keys
        values: List of values

    Returns:
        Dictionary
    """
    return dict(zip(keys, values))

# 7. Specialized Hash Tables
def create_counter(items: List[Any]) -> Dict[Any, int]:
    """
    Count occurrences

    Args:
        items: List of items

    Returns:
        Dictionary with counts
    """
    counter = {}
    for item in items:
        counter[item] = counter.get(item, 0) + 1
    return counter

def create_index(items: List[Any], key_func: Callable[[Any], Any]) -> Dict[Any, List[Any]]:
    """
    Create index by key function

    Args:
        items: List of items
        key_func: Function to extract key

    Returns:
        Dictionary mapping keys to lists of items
    """
    index = {}
    for item in items:
        key = key_func(item)
        if key not in index:
            index[key] = []
        index[key].append(item)
    return index

def group_by(items: List[Any], key_func: Callable[[Any], Any]) -> Dict[Any, List[Any]]:
    """
    Group items by key function

    Args:
        items: List of items
        key_func: Function to extract key

    Returns:
        Grouped dictionary
    """
    groups = {}
    for item in items:
        key = key_func(item)
        if key not in groups:
            groups[key] = []
        groups[key].append(item)
    return groups

# 8. Nested Dictionary Operations
def get_nested(ht: Dict[Any, Any], *keys, default: Any = None) -> Any:
    """
    Get value from nested dictionary

    Args:
        ht: Hash table
        *keys: Keys for nested access
        default: Default value

    Returns:
        Nested value or default
    """
    current = ht
    for key in keys:
        if isinstance(current, dict) and key in current:
            current = current[key]
        else:
            return default
    return current

def set_nested(ht: Dict[Any, Any], *keys, value: Any) -> None:
    """
    Set value in nested dictionary

    Args:
        ht: Hash table
        *keys: Keys for nested access
        value: Value to set
    """
    current = ht
    for key in keys[:-1]:
        if key not in current:
            current[key] = {}
        current = current[key]
    current[keys[-1]] = value

def flatten_nested_dict(ht: Dict[Any, Any], parent_key: str = '', sep: str = '.') -> Dict[Any, Any]:
    """
    Flatten nested dictionary

    Args:
        ht: Hash table
        parent_key: Parent key prefix
        sep: Separator for keys

    Returns:
        Flattened dictionary
    """
    items = []
    for k, v in ht.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, dict):
            items.extend(flatten_nested_dict(v, new_key, sep=sep).items())
        else:
            items.append((new_key, v))
    return dict(items)

# Usage Examples
def demonstrate_hash_table():
    print("=== Web Python Hash Table Examples ===\n")

    # 1. Basic operations
    print("--- 1. Basic Operations ---")
    ht = create_hash_table({'name': 'Alice', 'age': 30})
    print(f"Created: {ht}")
    put(ht, 'city', 'NYC')
    print(f"After put: {ht}")
    print(f"Get name: {get(ht, 'name')}")
    print(f"Contains 'age': {contains_key(ht, 'age')}")
    print(f"Keys: {get_keys(ht)}")
    print(f"Values: {get_values(ht)}")
    print(f"Size: {get_size(ht)}")

    # 2. Advanced operations
    print("\n--- 2. Advanced Operations ---")
    ht1 = {'a': 1, 'b': 2}
    ht2 = {'c': 3, 'd': 4}
    merged = merge_hash_tables(ht1, ht2)
    print(f"Merged: {merged}")
    set_default(ht1, 'e', 5)
    print(f"Set default: {ht1}")
    inverted = invert_hash_table({'a': 1, 'b': 2, 'c': 3})
    print(f"Inverted: {inverted}")

    # 3. Sorting
    print("\n--- 3. Sorting ---")
    data = {'apple': 5, 'banana': 2, 'cherry': 8, 'date': 1}
    print(f"Original: {data}")
    print(f"Sort by keys: {sort_by_keys(data)}")
    print(f"Sort by values: {sort_by_values(data)}")
    print(f"Max value: {find_max_value(data)}")
    print(f"Min value: {find_min_value(data)}")

    # 4. Lookup operations
    print("\n--- 4. Lookup Operations ---")
    scores = {'Alice': 95, 'Bob': 87, 'Charlie': 95, 'David': 92}
    print(f"Scores: {scores}")
    print(f"Keys with value 95: {find_keys_by_value(scores, 95)}")

    # 5. Specialized dictionaries
    print("\n--- 5. Specialized Dictionaries ---")
    items = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
    counter = create_counter(items)
    print(f"Counter: {counter}")

    data = [
        {'name': 'Alice', 'dept': 'IT'},
        {'name': 'Bob', 'dept': 'HR'},
        {'name': 'Charlie', 'dept': 'IT'}
    ]
    grouped = group_by(data, lambda x: x['dept'])
    print(f"Grouped by dept: {grouped}")

    # 6. Nested dictionaries
    print("\n--- 6. Nested Dictionaries ---")
    nested = {
        'user': {
            'name': 'Alice',
            'address': {
                'city': 'NYC',
                'zip': '10001'
            }
        }
    }
    print(f"Nested: {nested}")
    print(f"Get nested: {get_nested(nested, 'user', 'address', 'city')}")
    set_nested(nested, 'user', 'address', 'zip', value='10002')
    print(f"After set: {nested}")
    print(f"Flattened: {flatten_nested_dict(nested)}")

    print("\n=== All Hash Table Examples Completed ===")

# Export functions
# export { create_hash_table, put, get, remove, contains_key, contains_value }
# export { get_size, is_empty, clear_hash_table, get_keys, get_values, get_items }
# export { update_hash_table, merge_hash_tables, set_default, pop_value, pop_item }
# export { create_from_keys, create_from_mapping, filter_hash_table, invert_hash_table }
# export { sort_by_keys, sort_by_values, get_sorted_keys, get_sorted_values }
# export { find_keys_by_value, find_max_value, find_min_value }
# export { copy_hash_table, deep_copy_hash_table, to_string, from_tuples, from_lists }
# export { create_counter, create_index, group_by }
# export { get_nested, set_nested, flatten_nested_dict }
# export { demonstrate_hash_table }

💻 Liste Chaînée python

🔴 complex ⭐⭐⭐⭐

Implémenter et utiliser des listes chaînées simples avec des opérations d'insertion, suppression, parcours et inversion

⏱️ 35 min 🏷️ python, web, data structures, linked list
Prerequisites: Advanced Python, Classes, Pointers
# Web Python Linked List Examples
# Implementation of singly linked list with comprehensive operations

# 1. Node Class
class Node:
    """Linked list node"""

    def __init__(self, data: Any = None):
        self.data = data
        self.next: Optional['Node'] = None

    def __repr__(self):
        return f"Node({self.data})"

# 2. Linked List Class
class LinkedList:
    """Singly linked list implementation"""

    def __init__(self):
        self.head: Optional[Node] = None
        self.size = 0

    def __repr__(self):
        values = []
        current = self.head
        while current:
            values.append(str(current.data))
            current = current.next
        return " -> ".join(values) if values else "Empty List"

    def __len__(self):
        return self.size

    def __iter__(self):
        current = self.head
        while current:
            yield current.data
            current = current.next

    # 3. Insertion Operations
    def append(self, data: Any) -> None:
        """
        Append element to end

        Args:
            data: Data to append
        """
        new_node = Node(data)
        if not self.head:
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node
        self.size += 1

    def prepend(self, data: Any) -> None:
        """
        Add element to beginning

        Args:
            data: Data to prepend
        """
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node
        self.size += 1

    def insert_at(self, index: int, data: Any) -> bool:
        """
        Insert element at index

        Args:
            index: Insertion index
            data: Data to insert

        Returns:
            True if successful
        """
        if index < 0 or index > self.size:
            return False

        if index == 0:
            self.prepend(data)
            return True

        new_node = Node(data)
        current = self.head
        for _ in range(index - 1):
            current = current.next

        new_node.next = current.next
        current.next = new_node
        self.size += 1
        return True

    def insert_after(self, target_data: Any, new_data: Any) -> bool:
        """
        Insert after target element

        Args:
            target_data: Target element data
            new_data: New element data

        Returns:
            True if successful
        """
        current = self.head
        while current:
            if current.data == target_data:
                new_node = Node(new_data)
                new_node.next = current.next
                current.next = new_node
                self.size += 1
                return True
            current = current.next
        return False

    def insert_before(self, target_data: Any, new_data: Any) -> bool:
        """
        Insert before target element

        Args:
            target_data: Target element data
            new_data: New element data

        Returns:
            True if successful
        """
        if not self.head:
            return False

        if self.head.data == target_data:
            self.prepend(new_data)
            return True

        current = self.head
        while current.next:
            if current.next.data == target_data:
                new_node = Node(new_data)
                new_node.next = current.next
                current.next = new_node
                self.size += 1
                return True
            current = current.next
        return False

    # 4. Deletion Operations
    def delete(self, data: Any) -> bool:
        """
        Delete first occurrence of data

        Args:
            data: Data to delete

        Returns:
            True if deleted
        """
        if not self.head:
            return False

        if self.head.data == data:
            self.head = self.head.next
            self.size -= 1
            return True

        current = self.head
        while current.next:
            if current.next.data == data:
                current.next = current.next.next
                self.size -= 1
                return True
            current = current.next
        return False

    def delete_at(self, index: int) -> bool:
        """
        Delete element at index

        Args:
            index: Index to delete

        Returns:
            True if deleted
        """
        if index < 0 or index >= self.size:
            return False

        if index == 0:
            self.head = self.head.next
            self.size -= 1
            return True

        current = self.head
        for _ in range(index - 1):
            current = current.next

        current.next = current.next.next
        self.size -= 1
        return True

    def delete_head(self) -> bool:
        """
        Delete head element

        Returns:
            True if deleted
        """
        if not self.head:
            return False
        self.head = self.head.next
        self.size -= 1
        return True

    def delete_tail(self) -> bool:
        """
        Delete tail element

        Returns:
            True if deleted
        """
        if not self.head:
            return False

        if not self.head.next:
            self.head = None
        else:
            current = self.head
            while current.next.next:
                current = current.next
            current.next = None
        self.size -= 1
        return True

    # 5. Search Operations
    def find(self, data: Any) -> Optional[Node]:
        """
        Find node containing data

        Args:
            data: Data to find

        Returns:
            Node or None
        """
        current = self.head
        while current:
            if current.data == data:
                return current
            current = current.next
        return None

    def contains(self, data: Any) -> bool:
        """
        Check if data exists

        Args:
            data: Data to check

        Returns:
            True if exists
        """
        return self.find(data) is not None

    def index_of(self, data: Any) -> int:
        """
        Get index of data

        Args:
            data: Data to find

        Returns:
            Index or -1
        """
        current = self.head
        index = 0
        while current:
            if current.data == data:
                return index
            current = current.next
            index += 1
        return -1

    def get_at(self, index: int) -> Optional[Any]:
        """
        Get data at index

        Args:
            index: Index

        Returns:
            Data or None
        """
        if index < 0 or index >= self.size:
            return None

        current = self.head
        for _ in range(index):
            current = current.next
        return current.data

    # 6. Traversal Operations
    def to_list(self) -> list:
        """
        Convert to Python list

        Returns:
            List of data
        """
        result = []
        current = self.head
        while current:
            result.append(current.data)
            current = current.next
        return result

    def traverse(self, func: callable) -> None:
        """
        Apply function to each element

        Args:
            func: Function to apply
        """
        current = self.head
        while current:
            func(current.data)
            current = current.next

    def print_list(self) -> None:
        """Print linked list"""
        print(self)

    # 7. Update Operations
    def update(self, index: int, new_data: Any) -> bool:
        """
        Update data at index

        Args:
            index: Index
            new_data: New data

        Returns:
            True if updated
        """
        if index < 0 or index >= self.size:
            return False

        current = self.head
        for _ in range(index):
            current = current.next
        current.data = new_data
        return True

    # 8. Utility Operations
    def is_empty(self) -> bool:
        """
        Check if list is empty

        Returns:
            True if empty
        """
        return self.head is None

    def clear(self) -> None:
        """Clear all elements"""
        self.head = None
        self.size = 0

    def reverse(self) -> None:
        """Reverse the linked list"""
        prev = None
        current = self.head

        while current:
            next_node = current.next
            current.next = prev
            prev = current
            current = next_node

        self.head = prev

    def get_length(self) -> int:
        """
        Get length of list

        Returns:
            Length
        """
        return self.size

    def copy(self) -> 'LinkedList':
        """
        Create shallow copy

        Returns:
            New linked list
        """
        new_list = LinkedList()
        current = self.head
        while current:
            new_list.append(current.data)
            current = current.next
        return new_list

    # 9. Advanced Operations
    def count(self, data: Any) -> int:
        """
        Count occurrences of data

        Args:
            data: Data to count

        Returns:
            Count
        """
        count = 0
        current = self.head
        while current:
            if current.data == data:
                count += 1
            current = current.next
        return count

    def remove_duplicates(self) -> None:
        """Remove duplicate elements"""
        seen = set()
        current = self.head
        prev = None

        while current:
            if current.data in seen:
                prev.next = current.next
                self.size -= 1
            else:
                seen.add(current.data)
                prev = current
            current = current.next

    def sort(self, reverse: bool = False) -> None:
        """
        Sort the linked list

        Args:
            reverse: Sort descending
        """
        # Convert to list, sort, and rebuild
        data_list = self.to_list()
        data_list.sort(reverse=reverse)

        self.clear()
        for item in data_list:
            self.append(item)

    def find_middle(self) -> Optional[Any]:
        """
        Find middle element

        Returns:
            Middle data or None
        """
        if not self.head:
            return None

        slow = self.head
        fast = self.head

        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next

        return slow.data

    def has_cycle(self) -> bool:
        """
        Detect cycle using Floyd's algorithm

        Returns:
            True if cycle exists
        """
        if not self.head:
            return False

        slow = self.head
        fast = self.head

        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next

            if slow == fast:
                return True

        return False

    # 10. Static Creation Methods
    @classmethod
    def from_list(cls, data_list: list) -> 'LinkedList':
        """
        Create linked list from Python list

        Args:
            data_list: List of data

        Returns:
            New linked list
        """
        linked_list = cls()
        for item in data_list:
            linked_list.append(item)
        return linked_list

# 11. Utility Functions
def merge_sorted_lists(list1: LinkedList, list2: LinkedList) -> LinkedList:
    """
    Merge two sorted linked lists

    Args:
        list1: First sorted list
        list2: Second sorted list

    Returns:
        Merged sorted list
    """
    merged = LinkedList()
    current1 = list1.head
    current2 = list2.head

    while current1 and current2:
        if current1.data <= current2.data:
            merged.append(current1.data)
            current1 = current1.next
        else:
            merged.append(current2.data)
            current2 = current2.next

    while current1:
        merged.append(current1.data)
        current1 = current1.next

    while current2:
        merged.append(current2.data)
        current2 = current2.next

    return merged

def detect_intersection(list1: LinkedList, list2: LinkedList) -> Optional[Any]:
    """
    Detect intersection point of two lists

    Args:
        list1: First list
        list2: Second list

    Returns:
        Intersection data or None
    """
    # Get lengths
    len1, len2 = len(list1), len(list2)

    # Find starting points
    current1 = list1.head
    current2 = list2.head

    # Advance longer list
    for _ in range(abs(len1 - len2)):
        if len1 > len2:
            current1 = current1.next
        else:
            current2 = current2.next

    # Move both until intersection
    while current1 and current2:
        if current1 == current2:
            return current1.data
        current1 = current1.next
        current2 = current2.next

    return None

# Usage Examples
def demonstrate_linked_list():
    print("=== Web Python Linked List Examples ===\n")

    # 1. Basic operations
    print("--- 1. Basic Operations ---")
    ll = LinkedList()
    ll.append(1)
    ll.append(2)
    ll.append(3)
    print(f"After append: {ll}")
    ll.prepend(0)
    print(f"After prepend: {ll}")
    print(f"Length: {ll.get_length()}")
    print(f"Is empty: {ll.is_empty()}")

    # 2. Insertion
    print("\n--- 2. Insertion ---")
    ll.insert_at(2, 1.5)
    print(f"After insert at 2: {ll}")
    ll.insert_after(2, 2.5)
    print(f"After insert after 2: {ll}")

    # 3. Deletion
    print("\n--- 3. Deletion ---")
    ll.delete(1.5)
    print(f"After delete 1.5: {ll}")
    ll.delete_at(0)
    print(f"After delete at 0: {ll}")
    ll.delete_head()
    print(f"After delete head: {ll}")

    # 4. Search
    print("\n--- 4. Search ---")
    ll = LinkedList.from_list([10, 20, 30, 40, 50])
    print(f"List: {ll}")
    print(f"Contains 30: {ll.contains(30)}")
    print(f"Index of 30: {ll.index_of(30)}")
    print(f"Get at 2: {ll.get_at(2)}")
    print(f"Find middle: {ll.find_middle()}")

    # 5. Traversal
    print("\n--- 5. Traversal ---")
    print("Traverse with print:")
    ll.traverse(lambda x: print(f"  Item: {x}"))
    print(f"To list: {ll.to_list()}")

    # 6. Update
    print("\n--- 6. Update ---")
    ll.update(2, 35)
    print(f"After update index 2: {ll}")

    # 7. Advanced operations
    print("\n--- 7. Advanced Operations ---")
    ll = LinkedList.from_list([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5])
    print(f"Original: {ll}")
    print(f"Count of 5: {ll.count(5)}")
    ll.remove_duplicates()
    print(f"After remove duplicates: {ll}")
    ll.reverse()
    print(f"After reverse: {ll}")
    ll.sort()
    print(f"After sort: {ll}")

    # 8. Merge
    print("\n--- 8. Merge Sorted Lists ---")
    list1 = LinkedList.from_list([1, 3, 5, 7])
    list2 = LinkedList.from_list([2, 4, 6, 8])
    print(f"List1: {list1}")
    print(f"List2: {list2}")
    merged = merge_sorted_lists(list1, list2)
    print(f"Merged: {merged}")

    # 9. Create from list
    print("\n--- 9. Create From List ---")
    data = [100, 200, 300, 400]
    ll_from_list = LinkedList.from_list(data)
    print(f"From list {data}: {ll_from_list}")

    # 10. Cycle detection
    print("\n--- 10. Cycle Detection ---")
    ll = LinkedList.from_list([1, 2, 3, 4])
    print(f"List: {ll}")
    print(f"Has cycle: {ll.has_cycle()}")

    print("\n=== All Linked List Examples Completed ===")

# Export classes and functions
# export { Node, LinkedList }
# export { merge_sorted_lists, detect_intersection, demonstrate_linked_list }