Дело в том, что при создании словаря можно передать пары вида ((ключ, значение), (ключ, значение)). То есть кортеж (или иной итерируемый объект) где элементами являются соответствующие пары. В первом случае ты по факту так и делаешь, передаешь список (на самом деле генератор, не суть) с одним элементом вида (ключ, значение)
dict([("Воронеж", 7)])
Во втором же случае, ты передаешь кортеж не с парами (ключ, значени), а саму пару
dict(("Воронеж", 7))
И когда берется первый элемент, ожидается что он будет парой, а он строка
Потому, что в первом случае во встроенную ф-ию dict передаëтся итератор кортежей, а во втором - кортеж из 2 элементов (словарь и целое число). Из итератора кортежей можно сделать словарь, из кортежа, состоящего из списка и целого числа - нет.