Skip to content

Proposal: for in match within list comprehension #91540

Closed
@xareelee

Description

@xareelee

Just for discussion (I'm new to Python by the way). I saw an example for pattern matching with Class in Fluent Python (2nd Edition):

class City(typing.NamedTuple):
    continent: str
    name: str
    country: str

cities = [
    City('Asia', 'Tokyo', 'JP'),
    City('Asia', 'Delhi', 'IN'),
    City('North America', 'Mexico City', 'MX'),
    City('North America', 'New York', 'US'),
    City('South America', 'São Paulo', 'BR'),
]

def match_brazil():
    results = []
    for city in cities:
        match city:
            case City(country='BR', name=name):
                results.append(name)
    return results

It uses 5 lines of code to filter the items in the list (actually, it is filter and map; or flatMap in functional programming).

results = []
for city in cities:
    match city:
        case City(country='BR', name=name):
            results.append(name)

Is that possible use match case within list comprehension in current Python version? like this:

# When using `for ... in ... if ...` for current Python, you need lots of code after `if`.
results = [city.name for city in cities if (type(city) == City) and (city.country == 'BR')]

# Use `match case` instead of `if` in the list comprehension
results = [name for city in cities match case City(country='BR', name=name)]

# To minimize the code, you don't need `case` here (just `match` keyword is enough)
results = [name for city in cities match City(country='BR', name=name)]

# You can omit the `city` because you don't need it in this example (use `for _ in` or `for in`).
results = [name for _ in cities match City(country='BR', name=name)]
results = [name for in cities match City(country='BR', name=name)]

This would increase the readability and coding speed when you have lots logic to check. Maybe it also has chances to increase performance.

The syntax is more like SQL.

# final version (proposal)
def match_brazil():
    return [name for in cities match City(country='BR', name=name)]

That's my proposal: for in match within list comprehension

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions