我是python的新手。我在django中有一个二维列表。现在我想检查给定的文本是否在列表中。但它不起作用。这是我的代码:
newmessage = 'Bye'
stockWords = [
['hello', 'hi', 'hey', 'greetings'],
['Bye', 'Goodbye']
]
for i in range(0, len(stockWords)):
if newmessage.lower() in stockWords[i]:
return HttpResponse('Found')
else:
return HttpResponse('Not Found')
问题是它只适用于列表的第一个元素,第二个元素不起作用。
我做错了什么?有什么建议吗?
答案 0 :(得分:2)
更新:您的代码会检查.lower()
字符串,这不在任何列表中。 (' bye'和#39; Bye'是两个不同的对象)我已经在没有它的情况下测试了我的代码,并且它有效:
>>> for i in stockWords:
if newmessage in i:
print 'found'
found
为了使其工作,您需要在列表中小写所有字符串。
stocksLower = [stock.lower() for in_list in stockWords for stock in in_list]
请注意,它会创建一个列表,而不是列表列表。
如果您有序列(在您的案例中列表列表),则不需要迭代range
。你可以直接迭代它
for i in stockWords:
if newmessage.lower() in i:
return HttpResponse('Found')
else:
return HttpResponse('Not Found')
i
现在包含stockWords
列表中的一个元素并测试包含。
您的原始代码正在len
stockWords
上进行迭代,因此它没有检查内部列表。
答案 1 :(得分:1)
你可以尝试一下,生成压平一级的列表,并在其中找到
import itertools
stockWords = [
['hello', 'hi', 'hey', 'greetings'],
['Bye', 'Goodbye']
]
stock = itertools.chain.from_iterable(stockWords)
stock_lower = [x.lower() for x in stock]
newmessage = 'Bye'
if newmessage.lower() in stock_lower:
return HttpResponse('Found')
else:
return HttpResponse('Not Found')
答案 2 :(得分:0)
newmessage = 'Bye'
stockWords = [
['hello', 'hi', 'hey', 'greetings'],
['Bye', 'Goodbye']
]
for i in range(0, len(stockWords)):
if newmessage.lower() in [str(x).lower() for x in stockWords[i]]:
print( 'Found')
else:
print( 'Not Found')
答案 3 :(得分:0)
当您使用 for 循环时,您的 stockWords 是一个嵌套列表,它只包含 2 个元素(2 个列表),您可以将嵌套列表展平或更改循环逻辑,以便您也可以在嵌套循环中遍历
试试这个(没有平面):
newmessage = 'Bye'
stockWords = [['hello', 'hi', 'hey', 'greetings'],['Bye', 'Goodbye']]
for r in stockWords:
for c in r:
if newmessage.lower() == c.lower():
print("Found")
else:
print ('Not found')
如果没有记错的话@tisuchi 正在尝试创建一个函数(想要返回一些东西)但没有定义。 您还可以使用列表理解。我修改了答案@WBM
答案 4 :(得分:-1)
found = False
for i in stockWords:
for j in i:
if newmessage.lower() not in j:
continue
else:
found = True
break
response = HttpResponse('Found') if found else HttpResponse('Not Found')