W tym ćwiczeniu odtworzymy działanie funkcji array_column znanej z PHP w Pythonie, na trzy sposoby:

  • używając pętli foreach
  • używając metody map
  • używając składania list (list comprehension)

Funkcja array_column występuje w języku PHP i pozwala nam działać na listach zawierających w sobie zagnieżdżone słowniki i niejako wyciągać z nich listę określonych kluczy.

Coś takiego napiszemy sobie w Pythonie. Abyśmy się dobrze zrozumieli, oto nasza przykładowa lista:

people = [
    {
        "name": "John",
        "age" : 30
    },
    {
        "name": "Jane",
        "age": 20
    },
    {
        "name": "Bob",
        "age": 24
    },
]

Nasza funkcja ma przyjąć listę oraz klucz jako argument i zwrócić nam listę np. imion albo wartości age w tym przypadku.

Sposób 1 – pętla

def array_column(arr, column):
    output = []
    for record in arr:
        key = record.get(column);
        if key:
            output.append(key)
    return output


print(array_column(people, 'age'))
# [30, 20, 24]
print(array_column(people, 'name'))
# ['John', 'Jane', 'Bob']

Jak widać – tworzymy nową zmienną output, pusta lista. Lecimy po każdym rekordzie (słowniku w tej liście) i wyciągamy z niego wartość klucza, którego szukamy.

Następnie dodajemy ten klucz do output, zwracamy output, funkcja array_column działa (dokładnie jak w języku PHP).

Sposób 2 – metoda map

def array_column(arr, column):
    output = map(lambda x: x[column], arr)
    return list(output)


print(array_column(people, 'age'))
# [30, 20, 24]
print(array_column(people, 'name'))
# ['John', 'Jane', 'Bob']

Przy pomocy metody map przechodzimy po każdym słowniku, pokazując za pomocą funkcji lambda jak te słowniki chcemy „obrobić” – w tym wypadku, chcemy wziąć obiekt (zmienna x) i zwrócić wartość szukanej kolumny tego obiektu.

Całość jeszcze musimy opakować w „list()”, aby obiekt map zamienić na listę.

Sposób 3 – list comprehension

def array_column(arr, column):
    return [x[column] for x in arr]


print(array_column(people, 'age'))
# [30, 20, 24]
print(array_column(people, 'name'))
# ['John', 'Jane', 'Bob']

Tutaj mamy list comprehension. Dla każdego słownika w arr bierzemy wartość szukanej kolumny tego słownika i wrzucamy do listy.

Najbardziej „pythonowe” podejście to właśnie list comprehension.