Как получить список значений из словаря?
Заголовок: Как получить список значений из словаря в Python?
Содержание:
В Java получить значения из Map в виде списка так же просто, как выполнить list = map.values();
. Я хотел бы узнать, есть ли аналогичный простой способ в Python, чтобы получить список значений из словаря (dict).
4 ответ(ов)
В 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 nslist(small_ds.values())
: 336 ns
Для вещественных значений:
[*small_df.values()]
: 268 ns[].extend(small_df.values())
: 343 nslist(small_df.values())
: 336 ns
Для больших словарей:
Для строковых значений:
[*big_ds.values()]
: 17.5 ms[].extend(big_ds.values())
: 16.5 mslist(big_ds.values())
: 16.2 ms
Для вещественных значений:
[*big_df.values()]
: 13.2 ms[].extend(big_df.values())
: 13.1 mslist(big_df.values())
: 12.8 ms
Замеры проводились на процессоре Intel(R) Core(TM) i7-8650U @ 1.90GHz и с использованием IPython 7.5.0.
Выводы:
- Для небольших словарей
* оператор
работает быстрее. - Для больших словарей, где это имеет значение, возможно,
list()
оказывается немного быстрее.
Для выполнения вашей задачи и создания аналогичного кода на 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
, чтобы извлечь названия песен и количество воспроизведений в отдельные списки, а затем сортируем количество воспроизведений. Также показан альтернативный способ создания отсортированного списка.
Если вам нужно присвоить значения из словаря переменной в виде списка, можно использовать метод распаковки оператора *
, как показано ниже:
*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']
Если вы хотите, чтобы метод 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
.
Как отсортировать список словарей по значению словаря в Python?
Как вернуть ключи словаря в виде списка в Python?
Создание словаря (dict) из отдельных списков ключей и значений
Создание словаря с помощью генератора словарей
Диапазон букв в Python