Подтвердить что ты не робот

Dict.keys() [0] на Python 3

У меня есть это предложение:

def Ciudad(prob):
    numero = random.random()
    ciudad = prob.keys()[0]
    for i in prob.keys():
        if(numero > prob[i]):
            if(prob[i] > prob[ciudad]):
                ciudad = i
        else:
            if(prob[i] > prob[ciudad]):
                ciudad = i

    return ciudad

Но когда я называю это, появляется эта ошибка:

TypeError: 'dict_keys' object does not support indexing

Это проблема с версией? Я использую Python 3.3.2

4b9b3361

Ответ 1

dict.keys() - это словарь. Просто используйте list() непосредственно в словаре вместо этого, если вам нужен список ключей, элемент 0 будет первым ключом в произвольном порядке словаря:

list(prob)[0]

или еще лучше использовать:

next(iter(dict))

Любой метод работает как в Python 2 и 3, так и в опции next(), безусловно, более эффективен для Python 2, чем при использовании dict.keys(). Обратите внимание, однако, что словари не имеют установленного порядка, и вы не будете знать, какой ключ будет указан первым.

Похоже, вы пытаетесь найти максимальный ключ, используйте max() с dict.get:

def Ciudad(prob):
    return max(prob, key=prob.get)

Результат функции, безусловно, будет одинаковым для любого заданного словаря prob, так как ваш код не отличается в кодексах между ветвями сравнения случайных чисел оператора if.

Ответ 2

В Python 3.x dict.keys() не возвращает список, он возвращает итерацию (в частности, представление словаря). Стоит отметить, что сам dict также является итеративным из ключей.

Если вы хотите получить первый ключ, используйте вместо него next(iter(dict)). (Обратите внимание, что до того, как словари Python 3.6 были неупорядочены, "первый" элемент был произвольным. Начиная с 3.6 он будет основан на порядке вставки. Если вам нужно такое поведение в более старых версиях или с совместимостью между версиями, вы можете использовать collections.OrderedDict).

Это работает довольно просто: мы берем итерируемое из представления словаря с помощью iter(), затем используем next() чтобы продвинуть его на единицу и получить первый ключ.

Если вам нужно перебрать ключи - тогда определенно не нужно создавать список:

for key in dict:
    ...

Все это выгодно по сравнению с использованием list() как это означает, что список не создается, что делает его более быстрым и более эффективным в использовании памяти (следовательно, по умолчанию поведение keys() было изменено в 3.x). Даже в Python 2.x было бы лучше сделать next(iter(dict.iterkeys()).

Обратите внимание, что все эти вещи применимы и к dict.values() и dict.items().

Ответ 3

Я добился успеха, превратив итерации из словаря в список. Итак, для dic.keys(), dic.values() и dic.items() в Python3.6 вы можете:

dic = {'a':3, 'b':2, 'c':3}
print(dic)

dictkeys = dic.keys() # or values/items
print(dictkeys)

keylist = []
keylist.extend(iter(dictkeys)) # my big revelation
print('keylist', keylist)