#python #dictionary
#python #словарь
Вопрос:
Учитывая словарь my_dict, мы применяем list(my_dict)
и my_dict.keys()
в следующем коде
my_dict = {'1': 1, '2': 2, '3': 3, '4': 4}
list_keys = list(my_dict)
view_keys = my_dict.keys()
list_from_view = list(my_dict.keys())
print("list_keys : ", list_keys)
print("view_keys : ", view_keys)
print("list_from_view", list_from_view)
Результаты:
list_keys : ['1', '2', '3', '4']
view_keys : dict_keys(['1', '2', '3', '4'])
list_from_view ['1', '2', '3', '4']
В чем разница между использованием list(my_dict), my_dict.keys() и list(my_dict.keys()), особенно:
- список (my_dict) против my_dict.keys()
- список (my_dict) против списка (my_dict.keys()) (каков наилучший (быстрый) способ получить список ключей)
Спасибо.
Комментарии:
1. Еще один на ваш вопрос:
[k for k in my_dict]
. my_dict.keys() возвращает DictKeys, а не список.2. «каков наилучший (быстрый) способ получить список ключей» — вы можете измерить это
3. Разница во всех них была бы незначительной. Обычно я использую dict.keys()
Ответ №1:
Список Python является итерируемым, но не все итерации являются списком…
Давайте рассмотрим ваши выражения:
list_keys = list(my_dict)
: здесь вы используетеmy_dict
в качестве перебора ключи и создаете из них новый список. Короче говоря, вы скопировали ключи в список. С этого момента вы можете применять любые изменения к списку или исходному dict, ничего не меняя в другом объектеview_keys = my_dict.keys()
: здесь вы получаетеdict_keys
представление о словаре. Это немодифицируемый итерируемый объект, который можно использовать для доступа к ключам словаря. Если вы добавите элемент в словарь, вы сразу увидите его в представлении, но вы не можете ни добавить новый элементview_keys
, ни изменить или удалить егоlist_from_view = list(my_dict.keys())
: здесь вы получаете доступ к представлению ключей и повторяете его для создания списка. В конце концов, это точно так же, как и первый способ: вы получаете независимый список
Какой из них лучше? Это зависит.
Как я уже говорил, 1 и 3 дают эквивалентные списки. 1, вероятно, более питонический, потому что он использует тот факт, что словарь Python неявно является итеративным по своим ключам. 3, вероятно, легче понять для новых пользователей Python, поскольку он явно ссылается на операцию с ключами.
2 — это совершенно другое животное, потому что вместо независимого объекта list у вас есть представление исходного словаря, который будет следить за его изменениями.
Теперь вопрос:
каков наилучший (быстрый) способ получить список ключей
2 не вернет список ключей, потому что в списке есть append
или remove
методы, которых нет в представлении
1 и 3 следует рассматривать как эквивалентные с точки зрения производительности, и я уже говорил о удобочитаемости, которая является наиболее важным качеством кода Python
Вопрос, который вы должны были задать:
какой более питонический способ перебора списка ключей словаря?
Без сомнения for key in my_dict
. Нет необходимости преобразовывать это в список, и представление редко требуется
Ответ №2:
Основное различие в них заключается в двух типах, а именно list
и dict_keys
.
list
принимает все значения из заданных ключей одновременно и сохраняет их в list
объекте.
dict_keys
объект, с другой стороны, предоставляет вам представление о ключах словаря.
Разница между ними показана в следующем:
d = {1: 2, 3: 4}
a = d.keys()
b = list(d)
a
# dict_keys([1, 3])
b
# [1, 3]
d[5] = 6
a
# dict_keys([1, 3, 5])
b
# [1, 3]
В заключение dict_keys
object покажет вам ваши обновления dict
, как только они будут введены, при list
этом они останутся неизменными.
Если вы внесете изменения в list
эти изменения, они не будут отражены dict
, в то время как, с другой стороны, вы не можете вносить изменения dict_keys
.
Комментарии:
1. Большое вам спасибо, этот ответ предназначен для (1. list(my_dict) против my_dict.keys()), а как насчет 2. list(my_dict) против list(my_dict.keys()) ?
2. @ibra Вы можете использовать
timeit
для проверки, но обычноlist(my_dict)
кажется, что это быстрее.