搜索Python列表

时间:2013-03-18 01:11:28

标签: python file list search

好的,我有这段代码:

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个字符串)只是为了搜索字符串?

7 个答案:

答案 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块中。