Почему dict в python требует ([()])
Изучаю питон. Конспектирую словари, не понимаю почему синтаксис dict() такой странный. Как работать с list() или tuple() предельно понятно, но у dict какие то свои правила. Как создать словарь с помощью литерала - ясно. Как с помощью dict() тоже, по крайней мере в случае с объявлением переменных в самом dict(). Но непонятно, почему нельзя передать ему те же две переменные, но уже объявленные вне dict()? Зачем городить какие то [()] внутри этого dict() при попытке передать ему объекты напрямую?
Почему это dict_test=dict([(1,'Один'), (2,'Два')]) - работает,
а это dict_test=dict((1,'Один'), (2,'Два')) - нет, python ругается на то, что агрументов было передано 2, в то время как dict() якобы может принять только один? Почему он принимает только список кортежей? Ведь по идее с неизменяемым типом он должен как раз хорошо взаимодействовать?
Ответы (3 шт):
dict([(1,'Один'), (2,'Два')])
передаёте одни объект - [(1,'Один'), (2,'Два')]
dict((1,'Один'), (2,'Два'))
передаёте два объекта - (1,'Один') и (2,'Два')
Если их взять в круглые скобки, то есть tuple то все работает
dict(((1,'Один'), (2,'Два')))
передаёте одни объект - ((1,'Один'), (2,'Два'))
Судя по всему, вы хотите передать в конструктор генератор пар. Метод dict может принимать iterable-структуру, в том числе и генератор. Но для него нужен generator comprehension типа:
dict((i, i + 1) for i in range(10))
или
dict((("a", 1), ("b", 2)))
потому что tuple тоже являются iterable-объектами, как и генераторы.
По методу dict есть неплохая документация сказано, что тот может принимать
Ну вообще-то list в такой форме тоже не работает:
list(1, 2)
TypeError: list() takes at most 1 argument (2 given)
Потому что и dict и list хотят на вход iterable, из элементов которого они и заполняются.
В качестве iterable можно передать и список, и кортеж, и генератор, внутри которого уже для списка могут быть одиночные элементы, а вот для словаря нужно два элемента, поэтому внутри должен быть кортеж, например, поэтому и возникают ещё одни скобки - один дополнительный уровень вложенности по сравнению с инициализацией списка.