Прервать цикл, когда list len достигнет 5 (В цикле for)
Я создаю простую программу на python и пытаюсь отфильтровать некоторые ответы на основе предела для запуска цикла for или цикла while.
Что я пытаюсь сделать?
Я пытаюсь остановить цикл, когда список len
достигнет 5. Это может быть цикл for и цикл while.
views.py
def filter_array(request):
new_array = []
count = 1
quit = False
for m in res.get("blogs"):
for likes in m.get("likes"):
try:
count += 1
if likes == "user_1":
new_array.append(likes)
if count == 5:
quit = True
break
except:
quit = True
break
print(new_array)
return new_array
json ответ в views.py
res = {
"blogs": [
{
"title": "Blog 1",
"description": "Blog description",
"likes": [
"user_1",
"user_2",
]
},
{
"title": "Blog 2",
"description": "Blog description",
"likes": [
"user_4",
"user_5",
]
},
{
"title": "Blog 3",
"description": "Blog description",
"likes": [
"user_3",
]
},
{
"title": "Blog 4",
"description": "Blog description",
"likes": [
"user_3",
"user_4",
"user_5",
]
},
{
"title": "Blog 5",
"description": "Blog description",
"likes": [
"user_4",
"user_5",
]
},
]
}
Когда я выполняю приведенный выше код, он добавляет все элементы json в массив.
Но я хочу добавлять в список, если "likes" есть user_1
и останавливать цикл, когда len списка достигнет 5.
Я пробовал много часов, но он все еще не работает.
Любая помощь будет очень признательна.
Я не уверен, что именно вы пытаетесь сделать, но, насколько я понимаю, попробуйте следующее:
def filter_array(request):
new_array = []
count = 1
flag = False
for m in res.get("blogs"):
for likes in m.get("likes"):
try:
count += 1
if likes == "user_1":
new_array.append(likes)
if count == 5:
flag = True
break
except:
flag = True
break
if flag: # break if flag is True
break
print(new_array)
return new_array
Изменения
- Используйте
flag
вместоquit
, потому чтоquit()
является встроенной функцией. - Добавлена проверка флага во внешнем for-петле.
Вы можете получить первые пять элементов списка с помощью среза. Примерно так:
def filter_array(request):
all_likes = []
for likes in m.get("likes", [])
all_likes.extend(likes)
return all_likes[:5]
Не усложняйте ситуацию больше, чем нужно. Например, здесь нет причин для try...except
.
break
вырывается только из одного цикла. Поскольку у вас есть второй цикл, вложенный внутрь первого цикла, вам нужен еще один break
.
def filter_array(request):
new_array = []
count = 1
for m in res.get("blogs"):
for likes in m.get("likes"):
count += 1
if likes == "user_1":
new_array.append(likes)
if count == 5:
break
if count == 5:
break
print(new_array)
return new_array
IIUC это все, что вам нужно:
res = {
"blogs": [
{
"title": "Blog 1",
"description": "Blog description",
"likes": [
"user_1",
"user_2",
]
},
{
"title": "Blog 2",
"description": "Blog description",
"likes": [
"user_4",
"user_5",
]
},
{
"title": "Blog 3",
"description": "Blog description",
"likes": [
"user_3",
]
},
{
"title": "Blog 4",
"description": "Blog description",
"likes": [
"user_3",
"user_4",
"user_5",
]
},
{
"title": "Blog 5",
"description": "Blog description",
"likes": [
"user_4",
"user_5",
]
},
]
}
new_list = []
for dict_ in res['blogs']:
if 'user_1' in dict_.get('likes', []):
new_list.append(dict_)
if len(new_list) == 5:
break
print(new_list)
Выход:
[{'title': 'Blog 1', 'description': 'Blog description', 'likes': ['user_1', 'user_2']}]