如何测试列表中是否有任何字符串?

时间:2018-10-10 02:16:41

标签: python

我正在尝试制作AI。 AI知道对“ hi”说“ Hello”,并在“ bye”上停止该程序,如果您说了什么,它不知道会要求您定义它。例如,如果您说“你好”,它将询问这是什么意思。您输入“ hi”,从此以后,当您说“ Hello”时,它将再说“ Hello”。我将所有内容存储在一个称为“知识”的列表中。它是这样的:

knowledge = [[term, definition], [term, definition], [term, definition]]

我试图添加一个编辑功能,在其中键入edit foo,它将要求您输入字符串,以更改foo的定义。但是,我被卡住了。首先,当然,我需要测试它是否已经为foo定义。但是我做不到。无论定义如何,我都必须能够做到。在其他语言中,有typeOf()。但是type()似乎不起作用。这是我的东西,但是不起作用:

if [term, type(str)] in knowledge:

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

正如tehhowch在评论中所指出的,dictionary会更合适,因为它们是“键:值”对。

使用字典...

knowledge = {'foo': 'foo def', 'bar': 'bar def', 'baz': 'baz def'}
searchTerm= 'foo'
searchTerm in knowledge

Out[1]: True

knowledge存储为列表列表失败,因为knowledge中的每个项目本身就是一个列表。因此,在这些列表中搜索字符串类型(您的术语)会失败。相反,您可以将术语作为一个单独的列表拉出,然后检查要查找的术语是否在一个列表中。

knowledge = [["foo", "foo definition"], ["bar", "bar definition"], ["baz", "baz 
definition"]]

terms = [item[0] for item in knowledge]

searchTerm= "foo"
searchTerm in terms

Out[1]: True

答案 1 :(得分:0)

您可以使用字典来存储定义,而不是列表列表,而python的isinstance函数将帮助您检查term是否属于特定类。参见以下示例:

knowledge = {'Hello':'greeting','Hi':'greeting','Bye':'good bye'}

term = "Hello"

if isinstance(term, str):
    if term in knowledge:
        print("Defination exist")
    else:
        print("Defination doesn't exist") 
else:
    print("Entered term is not string")

答案 2 :(得分:0)

正如其他人提到的那样,Python通常会为这种关联数组使用字典。您的方法类似于称为Association List的Lisp数据结构。这些命令的效率不如字典使用的哈希表结构,但它们仍然具有一些有用的属性。

例如,如果您通过扫描成对的密钥并查找第一个密钥来查找密钥,则意味着您可以在前面插入具有相同密钥的另一对密钥 ,这将使密钥隐藏旧值。您不必删除它。这样可以加快插入速度(至少使用Lisp样式的链表)。您也可以通过删除新操作来“撤消”该操作,然后扫描程序将找到旧操作。

您的支票if [term, type(str)] in knowledge:可以像

if [term, str] in ([term, type(definition)] for term, definition in knowledge):

这使用生成器表达式将您的term, definition对立即转换为term, type(definition)对。