6

Как получить список значений из словаря?

1

Заголовок: Как получить список значений из словаря в Python?

Содержание:

В Java получить значения из Map в виде списка так же просто, как выполнить list = map.values();. Я хотел бы узнать, есть ли аналогичный простой способ в Python, чтобы получить список значений из словаря (dict).

4 ответ(ов)

0

В Python существует концепция, согласно которой должен быть один — и, желательно, только один — очевидный способ сделать что-то. В случае получения значений из словаря, этот единственный способ — использование list(dictionary.values()).

Тем не менее, какой способ быстрее в Python 3?

Сравнение: [*L] vs. [].extend(L) vs. list(L)

В приведенном ниже коде проводятся замеры времени выполнения трех различных подходов для извлечения значений из словаря:

small_ds = {x: str(x+42) for x in range(10)}
small_df = {x: float(x+42) for x in range(10)}

print('Small Dict(str)')
%timeit [*small_ds.values()]
%timeit [].extend(small_ds.values())
%timeit list(small_ds.values())

print('Small Dict(float)')
%timeit [*small_df.values()]
%timeit [].extend(small_df.values())
%timeit list(small_df.values())

big_ds = {x: str(x+42) for x in range(1000000)}
big_df = {x: float(x+42) for x in range(1000000)}

print('Big Dict(str)')
%timeit [*big_ds.values()]
%timeit [].extend(big_ds.values())
%timeit list(big_ds.values())

print('Big Dict(float)')
%timeit [*big_df.values()]
%timeit [].extend(big_df.values())
%timeit list(big_df.values())

Результаты:

Для небольших словарей:

  • Для строковых значений:

    • [*small_ds.values()]: 256 ns
    • [].extend(small_ds.values()): 338 ns
    • list(small_ds.values()): 336 ns
  • Для вещественных значений:

    • [*small_df.values()]: 268 ns
    • [].extend(small_df.values()): 343 ns
    • list(small_df.values()): 336 ns

Для больших словарей:

  • Для строковых значений:

    • [*big_ds.values()]: 17.5 ms
    • [].extend(big_ds.values()): 16.5 ms
    • list(big_ds.values()): 16.2 ms
  • Для вещественных значений:

    • [*big_df.values()]: 13.2 ms
    • [].extend(big_df.values()): 13.1 ms
    • list(big_df.values()): 12.8 ms

Замеры проводились на процессоре Intel(R) Core(TM) i7-8650U @ 1.90GHz и с использованием IPython 7.5.0.

Выводы:

  1. Для небольших словарей * оператор работает быстрее.
  2. Для больших словарей, где это имеет значение, возможно, list() оказывается немного быстрее.
0

Для выполнения вашей задачи и создания аналогичного кода на Python, который будет демонстрировать использование списка словарей с названиями песен и количеством их воспроизведения, вы можете использовать следующий пример:

songs = [
    {"title": "happy birthday", "playcount": 4},
    {"title": "AC/DC", "playcount": 2},
    {"title": "Billie Jean", "playcount": 6},
    {"title": "Human Touch", "playcount": 3}
]

print("====================")
print(f'Песни --> {songs} \n')
titles = list(map(lambda x: x['title'], songs))
print(f'Вывод названий песен --> {titles}')

playcounts = list(map(lambda x: x['playcount'], songs))
print(f'Вывод количества воспроизведений --> {playcounts}')
print(f'Вывод отсортированного количества воспроизведений --> {sorted(playcounts)}')

# Альтернативный способ
print(sorted(list(map(lambda x: x['playcount'], songs))))

В этом коде создается список словарей, где каждый словарь содержит название песни и количество ее воспроизведений. Мы используем функцию map, чтобы извлечь названия песен и количество воспроизведений в отдельные списки, а затем сортируем количество воспроизведений. Также показан альтернативный способ создания отсортированного списка.

0

Если вам нужно присвоить значения из словаря переменной в виде списка, можно использовать метод распаковки оператора *, как показано ниже:

*values, = d.values()
Получение списка значений для определенных ключей в словаре

Наиболее простой способ — это использование генератора списка с итерацией по list_of_keys. Если list_of_keys содержит ключи, которых нет в словаре d, следует воспользоваться методом .get(), который вернёт значение по умолчанию (None по умолчанию, но его можно изменить).

res = [d[k] for k in list_of_keys] 
# или
res = [d.get(k) for k in list_of_keys]

Как это часто бывает, в Python есть встроенный метод, который позволяет получить значения по ключам: itemgetter() из встроенного модуля operator.

from operator import itemgetter
res = list(itemgetter(*list_of_keys)(d))

Демонстрация:

d = {'a': 2, 'b': 4, 'c': 7}
list_of_keys = ['a', 'c']
print([d.get(k) for k in list_of_keys])
print(list(itemgetter(*list_of_keys)(d)))
# [2, 7]
# [2, 7]
Получение значений одного и того же ключа из списка словарей

Снова можно использовать генератор списка (итерация по списку словарей). Также можно воспользоваться itemgetter() для получения значений по конкретным ключам.

list_of_dicts = [ {"title": "A", "body": "AA"}, {"title": "B", "body": "BB"} ]

list_comp = [d['title'] for d in list_of_dicts]
itmgetter = list(map(itemgetter('title'), list_of_dicts))
print(list_comp)
print(itmgetter)
# ['A', 'B']
# ['A', 'B']
0

Если вы хотите, чтобы метод values() возвращал по умолчанию list (как в Python 2) вместо dict_values, то можно создать новый класс словаря и переопределить метод values:

class ldict(dict):
    # возвращает простой список вместо объекта dict_values
    values = lambda _: [*super().values()]

d = ldict({'a': 1, 'b': 2})
d.values()   # [1, 2]   (вместо dict_values([1, 2]))

Таким образом, при вызове d.values() вы получите обычный список значений. Это может быть полезно, если вам нужно работать именно с типом list, а не с представлением dict_values.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь