Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在列表中查找项的索引,用Python中的正则表达式搜索该项?_Python_Regex_List_Indexing - Fatal编程技术网

如何在列表中查找项的索引,用Python中的正则表达式搜索该项?

如何在列表中查找项的索引,用Python中的正则表达式搜索该项?,python,regex,list,indexing,Python,Regex,List,Indexing,我有一个这样的清单: lst = ['something', 'foo1', 'bar1', 'blabla', 'foo2'] 是否可以使用正则表达式和lst.index()获取以“foo”(foo1)开头的第一项的索引,如: ind = lst.index("some_regex_for_the_item_starting_with_foo") ? 我知道我可以创建计数器和for循环,并使用方法startswith()。 我很好奇我是否错过了一些更简短、更优雅的方法。我认为这没关系,如果

我有一个这样的清单:

lst = ['something', 'foo1', 'bar1', 'blabla', 'foo2']
是否可以使用正则表达式和
lst.index()
获取以“foo”(foo1)开头的第一项的索引,如:

ind = lst.index("some_regex_for_the_item_starting_with_foo") ?
我知道我可以创建计数器和for循环,并使用方法
startswith()

我很好奇我是否错过了一些更简短、更优雅的方法。

我认为这没关系,如果startswith方法能实现您真正想要的功能,您可以使用它(我不确定您是否真的需要这里的正则表达式-但是下面的代码可以很容易地修改为使用正则表达式):

或使用正则表达式:

from re import match
data = ['text', 'foo2', 'foo1', 'sample']
indeces = (i for i,val in enumerate(data) if match('foo', val))

使用
lst.index
无法实现这一点,但是这里有一种替代方法,您可能会发现它比for循环更优雅:

try:
    ind = (i for i, v in enumerate(lst) if v.startswith("foo")).next()
except StopIteration:
    ind = -1   # or however you want to say that the item wasn't found
正如senderle在评论中指出的那样,可以通过使用带有默认值的
next()
内置函数(2.6+)将其缩短为一行:

ind = next((i for i, v in enumerate(lst) if v.startswith("foo")), -1)

否,很遗憾,
列表.索引
没有
参数。 有了这一点,解决方案本来是可能的

# warning: NOT working code
result = L.index(True, key=lambda x: regexp.match(x) is not None)

此外,考虑到我刚刚发现
lambda
显然在python社区中被认为是一个令人憎恶的东西,我不确定将来是否会添加更多的
key
参数。但是Python没有。使用itertools有一些有趣的解决方案。(这也让我希望有一个
itertools.takewhile\u false
。如果它存在的话,这些将更具可读性。)

这是我的第一个想法,但它需要创建一个临时元组并计算其长度。然后我想到你可以做一个简单的求和,避免临时列表:

>>> print sum(1 for _ in takewhile(lambda x: not m.match(x), lst))
1
但这也有点麻烦。如果可能的话,我宁愿避免丢弃变量。让我们再试一次

>>> sum(takewhile(bool, (not m.match(x) for x in lst)))
1

好多了

你的解决方案是非常不同寻常的,同时也不太可读,但我得到了你所做的。我想用“not”代替函数takewhile_false更自然。同样的事情是,如果有一个while\u假循环而不是“while smth!=smth2”,我在itertools中找到了“dropwhile”。我猜这正是你所说的“takewhile_false”@rightaway717,不,
dropwhile
丢弃项目,直到谓词为真,然后接受其余的,就像
takewhile
接受项目直到谓词为真,然后丢弃其余的一样。换句话说,给定相同的iterable和谓词,
takewhile
将生成列表的第一部分,
dropwhile
将生成列表的第二部分。抱歉,这太糟糕了,你只是为了计算索引而构建一个元组(可能很大)?alexis,这就是我改进第一个版本的原因,如果你读了整篇文章,你肯定已经看到了。更高版本不创建元组。我想可能是
sum
在内部构建了一个元组——在这种情况下,我不得不对
sum
的实现提出异议。我会记住这个解决方案。我刚开始学习python,不知道它的意思和“我为我,val为我……”一样。现在我知道了。感谢您的努力。您不认为没有lambda,
有用吗?例如使用
操作符.itemgetter
?我也很好奇谁认为lambda是一个令人憎恶的东西。当然,它可能非常难看,但我认为它是语言的重要组成部分,尤其是当你有一个内置函数不能完全满足你的需要时。@senderle:yes
key
可以用于其他情况,但在许多常见情况下,使用一个小的匿名闭包非常适合
key
。关于为什么
lambda
如此令人讨厌,我最近(在EuroPython)发现了这个问题,我在一个示例
函数中问了为什么。在一个案例中使用了部分
,该案例应该是
lambda
的工作,Alex Martelli回答说。请看更详细的解释,谢谢,这为我澄清了问题。我认为这是一个(对我来说)实用性战胜纯洁性的例子。不过,我看到了阿美的一面;如果
lambda
被移除,我想我不会哭(太厉害了)。
l = ['something', 'foo1', 'bar1', 'blabla', 'foo2']
l.index(filter(lambda x:x.startswith('foo'),l)[0])
>>> sum(takewhile(bool, (not m.match(x) for x in lst)))
1
l = ['something', 'foo1', 'bar1', 'blabla', 'foo2']
l.index(filter(lambda x:x.startswith('foo'),l)[0])