#python
#python
Вопрос:
У меня есть словарь, который мне нужен для сравнения его значений после итерации со списком.
это мой код:
mdic = json.loads(data)
mylist = ['blue', 'green', 'red', 'black']
if not mdic['color_detail']:
raise ValueError('No color_detail available')
color_registered = False
for e in mylist:
if dic['color_detail'] == e:
color_registered = True
if not color_registered:
raise ValueError('Color not registered')
Есть ли лучший способ написать мой код? (Я имею в виду способ пропустить флаги False / True)
Комментарии:
1. Это выглядит нормально
2. Вы могли бы добавить
break
заявление послеcolor_registered = True
3.
color_registered = dic['color_detail'] in mylist
?4. @SayandipDutta Спасибо 🙏
Ответ №1:
Вы можете использовать встроенную any
функцию:
color_registered = any(e == dic['color_detail'] for e in mylist)
Комментарии:
1. Неплохо. Спасибо. Я совсем забыл
any
, как ты думаешь, это не медленно, потому что оно не встроено?2. @ElisaFo Это встроенная функция, и она, безусловно, быстрее, чем ваш цикл, потому что она вызывает короткое замыкание (например, если вы использовали a
break
внутри цикла).
Ответ №2:
Второй блок должен быть именно таким:
if dic['color_detail'] not in mylist:
raise ValueError('Color not registered')
И первая проверка могла бы лучше также охватывать несуществование, mdic
а не предполагать, что оно всегда есть:
if not mdic.get('color_detail'):
raise ValueError('No color_detail available')
Ответ №3:
вы хотите зациклить значения dict, например:
for i,j in dict.items():
if j in list:
#your logic
else:
#your logic
Ответ №4:
Зачем использовать список, когда можно использовать набор?
mdic = json.loads(data)
myset = {'blue', 'green', 'red', 'black'}
if mdic['color_detail'] in myset:
print('good selection')
else:
print('bad selection')
вы можете использовать ключевое in
слово с любой последовательностью, например, списками, кортежами, строками, наборами. преимущество наборов заключается в том, что выполняется один поиск, тогда как в списке каждый элемент проверяется по очереди, пока элемент не будет найден. В худшем случае элемент находится в конце списка, а для длинных списков это суммируется.