从列表中获取完全匹配的索引

时间:2015-08-18 00:33:01

标签: python string indexing find match

lst = ['a', 'b', 'c', 'aa', 'bb', 'cc']

def findexact(lst):
    i=0
    key = ['a','g','t']
    while i < len(lst):
        if any(item in lst[i] for item in key):
            print i

        i+=1

findexact(lst)

在上面的代码中,结果是:

0
3

我希望结果是:

0

我想获得“完全”匹配的索引。我需要做些什么来获得可接受的结果?

4 个答案:

答案 0 :(得分:3)

尝试将if any(item in lst[i] for item in key):更改为:

if any(item == lst[i] for item in key):

您获得了多个结果,因为'a'是in'aa'但是'a'不是==到'aa'。

这会给你你想要的行为吗?

答案 1 :(得分:0)

只需将in更改为==,然后让测试稍有不同,如下所示:

lst = ['a', 'b', 'c', 'aa', 'bb', 'cc']

def findexact(lst):
    key = ['a','g','t']
    for idx, elem in enumerate(lst):
        if any(item == elem for item in key):
            print idx

findexact(lst)

请注意,我直接迭代lst并从枚举中获取索引。这是一种更加pythonic的方式,而不是引入一个只跟踪索引的变量i。您可以进一步浓缩,因为其他答案中的一个衬垫显示。

答案 2 :(得分:0)

只需使用index()即可。这会告诉您给定list中给定项目的索引。如果它不存在,则会产生错误,我们将会发现错误。

lst = ['a', 'b', 'c', 'aa', 'bb', 'cc']

def findexact(lst):
    keys = ['a','g','t']
    for key in keys:
        try:
            return lst.index(key)
        except ValueError:
            pass

print findexact(lst)

答案 3 :(得分:0)

你可以在gen exp中使用enumerate,使用默认值调用next来捕获没有公共元素的位置:

def findexact(lst):
    key = {'a','g','t'}
    return next((ind for ind,ele in enumerate(lst) if ele in key), None)
lst = ['a', 'b', 'c', 'aa', 'bb', 'cc']
match = findexact(lst)
if match is not None:
  print(match)
0

这是O(n),因为设置查找是O(1),在最坏的情况下,我们会查看lst中的每个元素,对于大量数据,使用list.index或将密钥作为列表并使用in不能很好地扩展