簡體   English   中英

多個For循環,如果不滿足條件,則只打印一次

[英]Multiple For loops, print else only once if condition is not met

循環中有一個循環,如果條件滿足某些代碼運行。 但是,如果不滿足條件,我需要它來打印一些東西。 雖然如果我將代碼添加到任何位置,它會被多次打印。 如果不符合條件,如何只打印一次?

some_list = {'a_list': [{'name': 'Tom', 'age': 25}, {'name': 'John', 'age': 25}, {'name': 'Val', 'age': 25}], 'b_list': [{'name': 'Don', 'age': 25}, {'name': 'Tim', 'age': 25}, {'name': 'San', 'age': 25}]}

findperson = 'San'

for i in some_list:
    for y in some_list[i]:
        if y['name'].lower() == findperson.lower():
            print('Friend found')
            break
else:            
    print('Friend not found')

你可以使用any作為內循環(並從外循環break )......

for i in some_list:
    if any(y['name'].lower() == findperson.lower() for y in some_list[i]):
        print('Friend found')
        break
else:            
    print('Friend not found')

......甚至整件事:

if any(y['name'].lower() == findperson.lower() 
       for i in some_list for y in some_list[i]):
    print('Friend found')
else:            
    print('Friend not found')

如果你還需要真正的朋友,你可以使用next

for i in some_list:
    friend = next((y for y in some_list[i] if y['name'].lower() == findperson.lower()), None)
    if friend is not None:
        print('Friend found:', friend)
        break
else:            
    print('Friend not found')

還嵌套發電機在工作,就像any上面:

friend = next((y for i in some_list for y in some_list[i] 
                 if y['name'].lower() == findperson.lower()),
              None)
if friend is not None:
    print('Friend found:', friend)
else:            
    print('Friend not found')

而不是使用標志和break (只打破內循環),另一種可能的解決方案是使用一個函數。 這樣你就可以簡單地使用return 這也有利於在找到匹配后停止搜索。

some_list = {'a_list': [{'name': 'Tom', 'age': 25}, {'name': 'John', 'age': 25}, {'name': 'Val', 'age': 25}],
             'b_list': [{'name': 'Don', 'age': 25}, {'name': 'Tim', 'age': 25}, {'name': 'San', 'age': 25}]}

search_name = 'San'

def find_person(data, name_to_find):
    for i in data:
        for y in data[i]:
            if y['name'].lower() == name_to_find.lower():
                print('Friend found')
                return
    print('Friend not found')

find_person(some_list, search_name)

嘗試這個:

some_list = {'a_list': [{'name': 'Tom', 'age': 25}, {'name': 'John', 'age': 25}, {'name': 'Val', 'age': 25}], 'b_list': [{'name': 'Don', 'age': 25}, {'name': 'Tim', 'age': 25}, {'name': 'San', 'age': 25}]}

findperson = 'San'

found = False

for i in some_list:
    for y in some_list[i]:
        if y['name'].lower() == findperson.lower():
            print('Friend found')
            found = True
    if found:
        break
if not found:            
    print('Friend not found')

for else是一個很好的試驗,具有break條件,但只有在你獲得1-for循環時才有效,但是在這里你得到2-for循環,你可以使用一個標志:

some_list = {'a_list': [{'name': 'Tom', 'age': 25}, {'name': 'John', 'age': 25}, {'name': 'Val', 'age': 25}], 'b_list': [{'name': 'Don', 'age': 25}, {'name': 'Tim', 'age': 25}, {'name': 'San', 'age': 25}]}

findperson = 'San'
found = False

for i in some_list:
    for y in some_list[i]:
        if y['name'].lower() == findperson.lower():
            print('Friend found')
            found = True
            break
    if found:
        break

if not found:
    print('Friend not found')

最好的選擇imo是將嵌套的for循環放在一個函數中並在找到你的朋友時返回,但如果由於某種原因這是不可能的,你可以在你找到你的朋友時過早地結束你的嵌套for循環通過做類似的事情來使用旗幟

some_list = {'a_list': [{'name': 'Tom', 'age': 25}, {'name': 'John', 'age': 25}, {'name': 'Val', 'age': 25}], 
             'b_list': [{'name': 'Don', 'age': 25}, {'name': 'Tim', 'age': 25}, {'name': 'San', 'age': 25}]}

findperson = 'San'

for i in some_list:
    for y in some_list[i]:
        if y['name'].lower() == findperson.lower():
            print('Friend found')
            break
    else:
        continue
    break
else:
    print('Friend not found')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM