Ulrik Karlsson Ulrik Karlsson - 6 months ago 8
Python Question

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")

Answer

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")
Comments