我想从我的情况得到正确的结果,这是我的情况
这是我的数据库
这是我的密码:
我的定义文本
# define
country = ('america','indonesia', 'england', 'france')
city = ('new york', 'jakarta', 'london', 'paris')
c1="Country"
c2="City"
c3="<blank>"
和条件(“文本”在这里是从select数据库传递的,ofc使用looping-for)
if str(text) in str(country) :
stat=c1
elif str(text) in str(city) :
stat=c2
else :
stat=c3
我得到了错误的结果,就像这样
有什么办法可以让这个代码正常工作吗?当使用“in”时只包含一个文本时,它就工作了,但这种情况定义了这么多文本条件。
3条答案
按热度按时间e3bfsja21#
如果我没看错你的话,你需要。
输出:
bxgwgixi2#
你最好用字典。我假设文本是一个列表:
balp4ylt3#
首先,检查你在测试什么。
与您的设置相同。所以,你在测试子串的存在。
看看能不能找到一个国家。
对!不幸的是,一个简单的字符串测试,比如上面的一个,除了涉及不必要的列表到字符串的转换之外,还发现了一些不需要的东西。
这个
in
如果右边的字符串包含左边的子字符串,则字符串测试为true。这个in
但是,列表的test是不同的,当被测试的列表包含左侧的值作为元素时,test为true。很好!已经摆脱了“奇怪的其他比赛”的错误?
看来是这样。但是,使用列表包含测试需要检查输入字符串中的每个单词,而不是整个字符串。
上面的步骤与您现在所做的类似,只是测试列表元素,而不是将列表作为字符串。此表达式生成输入中的单词列表。
请注意,在分割输入时,您可能必须比我更小心。在上面的例子中,
"america, steve"
什么时候分手['america,', 'steve']
两个词都不匹配。这个
any
函数在表达式序列上迭代,返回True
在序列的第一个真成员处(和False
如果没有找到这样的元素)(这里我使用一个生成器表达式而不是一个列表,但是生成了相同的iterable序列)。对于额外的标记(这是留给读者的练习),您可以编写一个函数,该函数包含两个参数、一个句子和一个可能匹配的列表,如果列表中存在该句子中的任何单词,则返回true。然后可以使用两个不同的函数调用来处理国家和城市。
你可以通过使用集合而不是列表来提高速度,但是原理是一样的。