好的,我有这段代码:
colors = ["Red" , "Green" , "Blue" , "Pink" , "Purple" , "Cyan"]
search = str(raw_input())
found = "not"
if search in colors:
print "Found!"
else:
print "not Found"
到目前为止,只有当您在终端中输入与列表中的字符串完全相同的字符串时,它才能在列表中找到一个项目,这就是问题所在。
我需要能够在终端中键入一个或两个字符,并使其列出列表中与搜索匹配的字符串(例如:如果我要键入" P"终端,它会列出" Pink"" Purple"因为它们与我的搜索匹配到目前为止,但不完全相同)
我可能会忽略一些东西但是,有没有办法可以通过这种方式搜索列表,而不必拥有超过200行代码(200多行,因为我需要实现这一点,在列表中有超过150个字符串)只是为了搜索字符串?
答案 0 :(得分:5)
最简单的方法,使用列表解析:
matches = [color for color in colors if color.startswith(search)]
如果您有一个大型列表,这可能效果不佳。
答案 1 :(得分:2)
您需要的是适当的数据结构。根据您的要求说明,我认为trie就是那个。
使用颜色列表构建trie,然后使用用户输入搜索trie(允许使用前缀)。 您可以在github上找到各种实现,也可以自己实现。 :)
答案 2 :(得分:2)
如果性能不是问题,(例如:颜色列表很小):
colors = ["Red" , "Green" , "Blue" , "Pink" , "Purple" , "Cyan"]
search = str(raw_input())
found = "not"
for color in colors:
# or if color.startswith(search), depend on your needs
if search in color:
print "Found"
print "not Found"
否则,请使用Trie:http://en.wikipedia.org/wiki/Trie
答案 3 :(得分:2)
您可以使用difflib标准Python库。
示例代码:
from difflib import SequenceMatcher
colors = ["Red", "Green", "Blue", "Pink", "Purple", "Cyan"]
search = str(raw_input())
for color in colors:
s = SequenceMatcher(None, search, color)
if s.ratio() > 0.25:
print color
<强>输出:强>
xxxx$ python foo.py
p
Purple
注意:强>
您可以根据需要操纵匹配率。在这里,我使用了.25及以上的比率来挖掘采矿模式。
答案 4 :(得分:2)
使用正则表达式可以确定文本的多少以及需要匹配的部分。以下将只搜索字符串的开头。
import re
colors = ["Red" , "Green" , "Blue" , "Pink" , "Purple" , "Cyan"]
search = re.compile("^"+str(raw_input()))
isthere=[]
for col in colors:
if search.findall(col)!=[]:
isthere.append(col)
if isthere==[]:
print "Nothing there"
else:
print isthere
答案 5 :(得分:1)
search = str(raw_input())
matches = [s for s in colors if s.startswith(search)]
然后循环匹配并打印。
答案 6 :(得分:1)
for c in colors:
if c[0:len(search)-1] == search:
print "Found!"
不是绝对最优雅的解决方案,但它可以完成工作。只需循环遍历列表并比较相关的子字符串。不可否认,如果搜索字符串比颜色中的任何元素都长,您可能希望将此包装在TryError的try / catch块中。