Поиск в списке элемента типа "Словарь"
Имеется задача:
Напишите код, который считает количество элементов в заданном списке до тех пор, пока не встретится элемент типа словарь.
Пример:
для списка [3, "Вася", 0.45, 5, {'диван' : 2, 'слоники' : 9}, "мурзик", 34] на выходе должны получить число 4
Список для работы:
list = [39, 0.24, 3 + 3j, "Иван", 0.45, (8, 9), "кот", {"Камень": 3, 'Дерево':5}, 111]
Попытался решить так:
l = [39, 0.24, 3 + 3j, "Иван", 0.45, (8, 9), "кот", {"Камень": 3, 'Дерево':5}, 111]
x = len(l)
for i in range(x):
while l[i] == type(dict):
print(i)
break
Но, конечно же, условие цикла while неверное :)
Пробовал заменить на такие варианты while l[i] == {}, ну и подобные, но как понимаете- безрезультатно :)
Подскажите, пожалуйста, как определить наличие в списке словаря?
Ответы (4 шт):
Вам не нужно использовать цикл
while, так как вы имеете конечно число входных данных.
=> достаточно циклаforВ отличие от
type(), функцияisinstance()специально создана для проверки принадлежности данных определенному классу (типу данных).
=> используйте встроенную функциюisinstance().На выходе вы должны получить одно единственное значение.
=> Функцияprint(), выводящая количество элементов ДО словаря, должна быть после выполнения цикла.
count = 0
for item in mylist:
if isinstance(item, dict):
break
count += 1
print(count)
Ваш код имеет неверный алгоритм решения, а также само условие проверки на встречу с dict.
Нужно перебрать по очереди все элементы. Так зачем вам в каждой итерации новый цикл while? Нужна лишь одна проверка if.
Ваше предположение о проверке также неверно. Условие l[i] == type(dict) не будет работать. Потому что type(dict) будет всегда возвращать type. Проверьте сами:
print(type(dict))
print(type(int))
print(type(list))
# <class 'type'>
# <class 'type'>
# <class 'type'>
Плюс к этому вы пытаетесь сравнить значение l[i] с типом <class 'type'>.
Корректная проверка выглядит так type(l[i]) is dict или type(l[i]) == dict То есть является ли тип l[i] типом dict.
Кроме того, рекомендую отказаться от однобуквенных имен. Если к i в качестве индекса нет вопросов, то близкое по написанию l здесь излишне.
Итоговое решение без подсчета количества.
items = [39, 0.24, 3 + 3j, "Иван", 0.45, (8, 9), "кот", {"Камень": 3, 'Дерево':5}, 111]
for i in range(len(items)):
if type(items[i]) == dict:
break
print(items[i])
# 9
# 0.24
# (3+3j)
# Иван
# 0.45
# (8, 9)
# кот
Чуть иначе можно получить результат так
>>> [idx for idx, v in enumerate(lst) if isinstance(v,dict)].pop(0)
7
from itertools import takewhile
data = [39, 0.24, 3 + 3j, "Иван", 0.45, (8, 9), "кот", {"Камень": 3, 'Дерево':5}, 111]
res = len(list(takewhile(lambda x: not isinstance(x, dict), data)))
print(res)