Как сделать так, чтобы следующий цикл «для» продолжал цикл из предыдущего через словарь?

#python #list #dictionary #for-loop

Вопрос:

Если входные данные представляют собой список, он работает правильно

 list_data = [7,10,9,20,2,5,15,6,25,2,8,17,23,9,24,45,3,22,6,20,4]
pos_1 = 0
pos_2 = 0
for i in range(len(list_data)):
    if list_data[i] >= 25:
        pos_1 = i
        break
print(f"Position1 which has value greater than equal to 25: {pos_1}")
for i in range(pos_1 1,len(list_data)):
    if list_data[i] >= 25:
        pos_2 = i
        break
print(f"Position2 which has value greater than equal to 25: {pos_2}")
 

Вывод (2-й цикл для не будет повторять 1-й цикл для)

 Position1 which has value greater than equal to 25: 8
Position2 which has value greater than equal to 25: 15
 

Но если данные представляют собой такой словарь, как этот

 dic_data = {1: 10, 3: 20, 6: 15, 8: 25, 11: 17, 12: 23, 14: 24, 15: 45, 17: 22, 19: 20}
index_1 = 0
for i in range(len(dic_data)):
    if(dic_data.values() >= 25):
        pos_1 = dic_data.keys()
        index_1 = i
        break
print(f"Position1 which has value greater than equal to 25: {pos_1}")

for i in range(index_1 1,len(dic_data)):
    if(dic_data.values() >= 25):
        pos_2 = dic_data.keys()
        break
print(f"Position2 which has value greater than equal to 25: {pos_2}")
 

Конечно, это должно быть ошибкой

Как работать с данными словаря? (оба они не являются моим фактическим кодом, это просто пример)

Комментарии:

1. С помощью диктанта, что представляет собой ключ и значение в отношении вашего первого кода ? Если значение больше 25, сохраните ключ ?

2. Что вы имеете в виду, говоря «Конечно, это должно быть ошибкой»? Вы не сказали нам, каков результат второго блока кода. Я бы рекомендовал вам распечатать различные условия и функции для диктовок, чтобы вы могли видеть, что они делают. Потому что я не думаю, что этот код делает то, что вы хотите.

3. Извините всех за мои неясные вопросы.

Ответ №1:

Вы можете использовать переменную итератора с функцией enumerate() :

 dic_data = {1: 10, 3: 20, 6: 15, 8: 25, 11: 17, 12: 23, 
            14: 24, 15: 45, 17: 22, 19: 20}

iData = enumerate(dic_data.values()) # or iter(dic_data.items()) to get keys

for i,value in iData:
    if (value >= 25):
        pos_1 = i
        break
print(f"Position1 which has value greater than equal to 25: {pos_1}")

for i,value in iData:
    if(value >= 25):
        pos_2 = i
        break
print(f"Position2 which has value greater than equal to 25: {pos_2}")
 

выход:

 Position1 which has value greater than equal to 25: 3
Position2 which has value greater than equal to 25: 7
 

Обратите внимание, что вы не можете получить доступ к словарю по позиционному индексу, поэтому вывод имеет ограниченное практическое применение

Комментарии:

1. Вы правы, изначально у меня там был dic_data.keys (), я не понимал, что iter() больше не нужен, когда переключил его на индексы возвращаемых значений. Я исправил ответ, спасибо.

Ответ №2:

.keys() И .values() представляет собой весь список ключей или значений, вы ничего не можете сделать с ним в отношении сравнения или индекса. Вам нужно выполнить итерацию по парам дикта : items

 dic_data = {1: 10, 3: 20, 6: 15, 8: 25, 11: 17, 12: 23, 14: 24, 15: 45, 17: 22, 19: 20}
index_1, pos_1, pos_2 = 0, 0, 0
for idx, (k, v) in enumerate(dic_data.items()):
    if v >= 25:
        pos_1 = k
        index_1 = idx
        break
print(f"Position1 which has value greater than equal to 25: {pos_1}")

for idx, (k, v) in enumerate(list(dic_data.items())[index_1   1:]):
    if v >= 25:
        pos_2 = k
        break
print(f"Position2 which has value greater than equal to 25: {pos_2}")
 
 Position1 which has value greater than equal to 25: 8
Position2 which has value greater than equal to 25: 15
 

Ответ №3:

Это мое решение проблемы. Я избавился от большей части лишнего кода.

ps: Я добавил переменную, которая отображает значения позиций ( first_ value и second_value ) на случай, если вы захотите проверить правильность ответа.

 dic_data = {1: 10, 3: 20, 6: 15, 8: 25, 11: 17, 12: 23, 14: 24, 15: 45, 17: 22, 19: 20}

extra_list = list(dic_data.values())
for i in extra_list:
    if(i >= 25):
        pos_1 = extra_list.index(i)
        first_value = i
        break
print(f"Position1 which has value greater than equal to 25: {pos_1}.The value in that position is {first_value}")

for i in extra_list[pos_1 1:]:
    if(i >= 25):
        pos_2 = extra_list.index(i)
        second_value = i
        break
print(f"Position2 which has value greater than equal to 25: {pos_2}. The value in that position is {second_value}.")
 

Я создал функцию, которая должна помочь сэкономить время

 def greater_equal_25(list1, pos = 0):
    '''based on your needs use the value or key methods on the dictionary and then
    create a variable that has the list of the method using the list function'''
    if pos == 0:
        for i in list1[pos:]:
            if (i >= 25):
                posx = extra_list.index(i)
                second_value = i
                break
    else:
        for i in list1[pos 1:]:
            if (i >= 25):
                posx= extra_list.index(i)
                second_value = i
                break
    return posx