简体   繁体   中英

How do you search in triple nested lists?

I am trying to search through triple nested lists in python. I came up with a super messy way that doesn't work. How do you do this effectively? I'm using python 3. The list I'm trying to search through is not nececarily triple nested in every slot.

Here's is the bad messy way I wrote that doesn't work for some reason.

HELLO = ["hello", "hi"]
GOODBYE = ["goodbye", "bye"]

POLITENESS = [HELLO, GOODBYE]

FRUITS = ["apples", "bananas"]
MEAT = ["pork", "chicken"]

FOODS = [FRUITS, MEAT]

random_Words = ["shoe", "bicycle", "school"]


#Here is the triple nested list.
VOCABULARY = [POLITENESS, FOODS, random_Words, "house"]

knowWord = False
userInput = input("say whatever")

#this checks for userInput in triple nested lists
#first it checks whether the first slot in vocabulary is nested,
#if that's the case it checks if the lists wiithin vocabulary[i] is nested and goes on like that.
#when finally it comes to a list that is not nested it checks for userInput in that list.

for i in range(len(VOCABULARY)):
    #if list item is not nested
    if any(isinstance(j, list) for j in VOCABULARY[i]) == False:
            #if userinput is inside a non-nested list
            if userInput not in VOCABULARY[i]:
                continue
            else:
                #if userInput is found
                knowWord = True
                break
    #if list is nested
    else:
        continue
    for k in range(len(VOCABULARY[i])):
        if any(isinstance(l, list) for l in VOCABULARY[i][k]) == False:
                if userInput not in VOCABULARY[i][k]:
                    continue
                else:
                    knowWord = True
                    break
        else:
            continue
        for m in range(len(VOCABULARY[i][k])):
            if any(isinstance(n, list) for n in VOCABULARY[i][k][m]) == False:
                    if userInput not in VOCABULARY[i][k][m]:
                        continue
                    else:
                        knowWord = True
                        break
            else:
                continue

if knowWord == True:
    print("YES")
else:
    print("I don't know that word")

To make your code work you can simply remove these lines:

#if list is nested
else:
    continue

To make the code nicer, you can use recursion. This function finds out if a given word is inside however many nested lists you have:

def findWord(word,l):
    words = []
    lists = []
    for entry in l:
        if isinstance(entry,list):
            lists.append(entry)
        else:
            words.append(entry)


    for w in words:
        if w == word:
            return True

    for ls in lists:
        if findWord(word,ls) == True:
            return True

    return False



if findWord(userInput,VOCABULARY) == True:
    print("YES")
else:
    print("I don't know that word")

If you want to use nested lists only then below might help you, otherwise, solution mentioned above to flatten the list or converting to Set can be used also

def check(val):
    for i in itertools.chain(VOCABULARY):
        if val in i:
            return True
    return False

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM