你如何在三重嵌套列表中搜索?
How do you search in triple nested lists?
我正在尝试搜索 python 中的三重嵌套列表。我想出了一个超级混乱的方法,但行不通。你如何有效地做到这一点?我正在使用 python 3. 我尝试搜索的列表不一定在每个插槽中嵌套三重。
这是我写的糟糕而混乱的方式,由于某种原因不起作用。
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")
要使您的代码正常工作,您只需删除这些行:
#if list is nested
else:
continue
为了让代码更漂亮,你可以使用递归。这个函数会找出一个给定的词是否在里面,无论你有多少嵌套列表:
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")
如果您只想使用嵌套列表,那么下面可能会对您有所帮助,否则,也可以使用上面提到的将列表展平或转换为 Set 的解决方案
def check(val):
for i in itertools.chain(VOCABULARY):
if val in i:
return True
return False
我正在尝试搜索 python 中的三重嵌套列表。我想出了一个超级混乱的方法,但行不通。你如何有效地做到这一点?我正在使用 python 3. 我尝试搜索的列表不一定在每个插槽中嵌套三重。
这是我写的糟糕而混乱的方式,由于某种原因不起作用。
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")
要使您的代码正常工作,您只需删除这些行:
#if list is nested
else:
continue
为了让代码更漂亮,你可以使用递归。这个函数会找出一个给定的词是否在里面,无论你有多少嵌套列表:
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")
如果您只想使用嵌套列表,那么下面可能会对您有所帮助,否则,也可以使用上面提到的将列表展平或转换为 Set 的解决方案
def check(val):
for i in itertools.chain(VOCABULARY):
if val in i:
return True
return False