如何在Python中将特定文本搜索到二维数组中

时间:2017-10-06 08:45:06

标签: python django

我是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')

问题是它只适用于列表的第一个元素,第二个元素不起作用。

我做错了什么?有什么建议吗?

5 个答案:

答案 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')