我有一个100个左右的元素的列表,实际上是一个包含每行的电子邮件元素。这个列表有轻微的变化,因为其中有一个\ n的行被放在一个单独的元素中,所以我不能简单地使用固定值进行分片。我基本上需要一个可变的开始和结束短语(需要进行部分搜索,因为我的一个开始短语实际上可能是Total Cost: $13.43
,所以我只会使用Total Cost:
。)与结尾短语相同。我也不希望在返回的列表中包含开始/停止词组。总结:Python:在字符串列表中查找X到Y
>>> email = ['apples','bananas','cats','dogs','elephants','fish','gee']
>>> start = 'ban'
>>> stop = 'ele'
# the magic here
>>> print new_email
['cats', 'dogs']
注意
- 虽然电子邮件不是完美的格式,它是相当一致的所以有一个渺茫的机会开始/停止短语会出现不止一次。
- 也没有空白的元素。
SOLUTION
只是为了funzies并感谢这里大家的帮助是我的最终代码:
def get_elements_positions(stringList=list(), startPhrase=None, stopPhrase=None):
elementPositionStart, elementPositionStop = 0, -1
if startPhrase:
elementPositionStart = next((i for i, j in enumerate(stringList) if j.startswith(startPhrase)), 0)
if stopPhrase:
elementPositionStop = next((i for i, j in enumerate(stringList) if j.startswith(stopPhrase)), -1)
if elementPositionStart + 1 == elementPositionStop - 1:
return elementPositionStart + 1
else:
return [elementPositionStart, elementPositionStop]
它返回的起始和结束元素位置,默认为0和列表-1如果无法找到相应的值。 (0是第一个元素,-1是最后一个元素)。
SOLUTION-B
我做一个小的变化,现在如果列表被描述的开始和停止位置,导致仅有1元件之间它返回元件位置为整数,而不是一个列表您仍然获得多线回报。
再次感谢!
你不需要返回列表,返回元组通常工作得很好。 [将list()'作为默认值做的事情完全不同。](http://docs.python.org/tutorial/controlflow.html#default-argument-values)。我的代码也是这样的原因是DRY。 – SilentGhost 2010-06-03 17:04:52
是的,我仍然在研究整个“好Python程序员”的事情。我开始与Django一起学习Python,所以我觉得我可能错过了很多Python的小功能,但我正在学习。 – TheLizardKing 2010-06-03 17:29:17