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

Словарь Python Iterate по индексу

Я хочу итерации через словарь в python по номеру индекса.

Пример:

 dict = {'apple':'red','mango':'green','orange':'orange'}

Я хочу выполнить итерацию через словарь с первого по последний, чтобы я мог получить доступ к элементам словаря своими индексами. Например, первым элементом будет яблоко, а вторым элементом будет манго, а значение будет зеленым.

Что-то вроде этого:

for i in range(0,len(dict)):
    dict.i
4b9b3361

Ответ 1

Я не могу придумать, почему вы хотели бы этого сделать. Если вам просто нужно перебирать словарь, вы можете просто сделать.

for key, elem in testDict.items():
    print key, elem

ИЛИ

for i in testDict:
     print i, testDict[i]

Ответ 2

Вы можете перебирать ключи и получать значения по клавишам:

for key in dict.iterkeys():
    print key, dict[key]

Вы можете перебирать ключи и соответствующие значения:

for key, value in dict.iteritems():
    print key, value

Вы можете использовать enumerate, если хотите индексы (помните, что словари не имеют порядка):

>>> for index, key in enumerate(dict):
...     print index, key
... 
0 orange
1 mango
2 apple
>>> 

Ответ 3

Здесь есть очень хорошие ответы. Я также хотел бы добавить следующее:

some_dict = {
    "foo": "bar",
    "lorem": "ipsum"
}

for index, (key, value) in enumerate(some_dict.items()):
    print(index, key, value)

приводит к

0 foo bar
1 lorem ipsum

Появляется для работы с Python 2.7 и 3.5

Ответ 4

Я хотел знать (idx, key, value) для python OrderedDict today (сопоставление единиц SKU с количествами в порядке их появления в квитанции). Ответы здесь были обломками.

В python 3, по крайней мере, этот способ работает и имеет смысл.

In [1]: from collections import OrderedDict
   ...: od = OrderedDict()
   ...: od['a']='spam'
   ...: od['b']='ham'
   ...: od['c']='eggs'
   ...: 
   ...: for i,(k,v) in enumerate(od.items()):
   ...:    print('%d,%s,%s'%(i,k,v))
   ...: 
0,a,spam
1,b,ham
2,c,eggs

Ответ 5

Поскольку вы хотите итератировать по порядку, вы можете использовать sorted:

for k, v in sorted(dict.items()):
    print k,v

Ответ 6

Сделайте это:

for i in dict.keys():
  dict[i]

Ответ 7

Есть несколько способов вызвать цикл for в python и вот что я нашел до сих пор:

A = [1,2,3,4]
B = {"col1": [1,2,3],"col2":[4,5,6]}

# Forms of for loop in python:
# Forms with a list-form,
for item in A:
    print(item)
print("-----------")
  for item in B.keys():
    print(item)
print("-----------")
  for item in B.values():
    print(item)
print("-----------")
  for item in B.items():
    print(item)
    print("The value of keys is {} and the value of list of a key is {}".format(item[0],item[1]))
print("-----------")

Результаты:

1
2
3
4
-----------
col1
col2
-----------
[1, 2, 3]
[4, 5, 6]
-----------
('col1', [1, 2, 3])
The value of keys is col1 and the value of list of a key is [1, 2, 3]
('col2', [4, 5, 6])
The value of keys is col2 and the value of list of a key is [4, 5, 6]
-----------

Ответ 8

В некоторых комментариях верно сказано, что эти ответы не соответствуют вопросу.

Одна из причин, по которой можно захотеть перебрать словарь с помощью "индексов", заключается, например, в том, чтобы вычислить матрицу расстояний для набора объектов в словаре. Чтобы привести это в качестве примера (перейдя немного к основам в пуле ниже):

  • Предполагая, что у одного есть 1000 объектов в словаре, квадратная матрица расстояний учитывает все комбинации от одного объекта до любого другого, и поэтому она будет иметь размеры 1000x1000 элементов. Но если расстояние от объекта 1 до объекта 2 такое же, как от объекта 2 до объекта 1, необходимо вычислить расстояние только до половины квадратной матрицы, так как диагональ будет иметь расстояние 0, а значения отражены выше и ниже диагонали.

Вот почему в большинстве пакетов используется матрица сжатых расстояний (Как работает матрица сокращенных расстояний? (Pdist))

Но рассмотрим случай, когда один реализует вычисление матрицы расстояний или любой вид перестановки такого рода. В таком случае вам нужно пропустить результаты более чем в половине случаев. Это означает, что цикл FOR, который проходит через весь словарь, просто нажимает на IF и переходит на следующую итерацию, не выполняя фактически никакой работы большую часть времени. Для больших наборов данных эти дополнительные "IF" и циклы в сумме составляют необходимое количество времени обработки, и их можно было бы избежать, если бы в каждом цикле начинался один "индекс" дальше по словарю.

Переходя к вопросу, мой вывод прямо сейчас заключается в том, что ответ НЕТ. Никто не может напрямую получить доступ к значениям словаря по любому индексу, кроме ключа или итератора.

Я понимаю, что большинство ответов до сих пор применяют различные подходы для выполнения этой задачи, но на самом деле не допускают никаких манипуляций с индексами, что было бы полезно в таких случаях, как примеры.

Единственная альтернатива, которую я вижу, - это использовать список или другую переменную в качестве последовательного индекса для словаря. Здесь, чем идет реализация, чтобы проиллюстрировать такой случай:

#!/usr/bin/python3

dishes = {'spam': 4.25, 'eggs': 1.50, 'sausage': 1.75, 'bacon': 2.00}
print("Dictionary: {}\n".format(dishes))

key_list = list(dishes.keys())
number_of_items = len(key_list)

condensed_matrix = [0]*int(round(((number_of_items**2)-number_of_items)/2,0))
c_m_index = 0

for first_index in range(0,number_of_items):
    for second_index in range(first_index+1,number_of_items):
        condensed_matrix[c_m_index] = dishes[key_list[first_index]] - dishes[key_list[second_index]]
        print("{}. {}-{} = {}".format(c_m_index,key_list[first_index],key_list[second_index],condensed_matrix[c_m_index]))
        c_m_index+=1

Выход:

Dictionary: {'spam': 4.25, 'eggs': 1.5, 'sausage': 1.75, 'bacon': 2.0}

0. spam-eggs = 2.75
1. spam-sausage = 2.5
2. spam-bacon = 2.25
3. eggs-sausage = -0.25
4. eggs-bacon = -0.5
5. sausage-bacon = -0.25

Также стоит упомянуть, что такие пакеты, как intertools, позволяют выполнять аналогичные задачи в более коротком формате.