Python-仅当值为偶数时创建元组

Python-仅当值为偶数时创建元组,python,Python,我有一个工作代码集,它遍历一个字符串并搜索两个相关的子字符串。(大声向user@bulbus寻求帮助!) 代码返回一个元组列表,其中包含每个子字符串的下一个实例的位置的索引位置 例如,如果字符串和子字符串如下所示: sub_A = "StringA" sub_B = "StringB" s = "abcdefStringAghijklStringB" [(m.start(),re.compile(sub_b).search(s,m.start()).start()) for m in re.

我有一个工作代码集,它遍历一个字符串并搜索两个相关的子字符串。(大声向user@bulbus寻求帮助!)

代码返回一个元组列表,其中包含每个子字符串的下一个实例的位置的索引位置

例如,如果字符串和子字符串如下所示:

sub_A = "StringA"
sub_B = "StringB"

s = "abcdefStringAghijklStringB"
[(m.start(),re.compile(sub_b).search(s,m.start()).start()) for m in re.finditer(sub_A,s)]
然后代码返回元组
(6,19)
,因为这是两个字符串存在的下一个索引位置

代码的相关部分如下所示:

sub_A = "StringA"
sub_B = "StringB"

s = "abcdefStringAghijklStringB"
[(m.start(),re.compile(sub_b).search(s,m.start()).start()) for m in re.finditer(sub_A,s)]
但是,我希望更改代码,使其仅在值为偶数时将值返回到元组。即,在我上面的示例中,值“19”不应是有效的返回值

例如,假设这是我的新字符串:

xxstringastringb

我希望元组返回
(2,16)
。因为这些是下一个“有效”的回报

我的代码当前返回
(2,9)
,但我想跳过索引9处的“StringB”,因为它是奇数

想法?谢谢

>>> s = "abcdefStringAghijklStringB"                                                                
>>> [(m.start(),next((x.start() for x in re.compile(sub_B).finditer(s,m.start()) if x.start()%2==0),None)) for m in re.finditer(sub_A,s)]
[(6, None)]
>>> s='xxStringAStringBStringB'                                                                     
>>> [(m.start(),next((x.start() for x in re.compile(sub_B).finditer(s,m.start()) if x.start()%2==0),None)) for m in re.finditer(sub_A,s)]
[(2, 16)]
  • 我们使用
    finditer
    查找
    sub\u A
    之后的所有
    sub\u B
    ,但我们需要在满足第一个条件(偶数位置)的情况下进行救助
  • 为此,我们使用next()调用退出迭代。阅读更多
  • 现在,如果我们没有找到
    sub_B
    我们希望迭代返回一个默认值,在这种情况下,我们选择了
    None

  • 你在你的帖子中广泛使用“touple”一词。你是说元组吗?或者这是别的?你能过滤你的最终列表以满足你的标准吗?@Jason Sperske:我不知道我是否能过滤最终列表-因为有时候下一个
    StringA
    是偶数,但下一个
    StringB
    是奇数。在这种情况下,我需要忽略
    StringB
    ——但仍然使用
    StringA
    ——这有意义吗@汤姆·卡兹:打字错误-谢谢。太棒了。下一步该做了!再次感谢您的帮助,并对延迟回复表示抱歉。我说得有点太早了。我的头撞在墙上,想知道如何让next()交互也处理sub_A值。我让它用以下整行代码来处理sub_B:
    {(k,frameType[k]):[m.start(),len(frameType[k])+next((x.start()代表re.compile中的x.frameType[k]).finditer(s,m.start(),如果x.start()%2==0,则无))代表re.finditer(k,s)]代表frameType中的k}
    。。。我尝试为我认为正确的位置添加next()调用,但得到的结果是TypeError:“int”对象不是迭代器。。。。有什么想法吗?他们似乎不明白这个问题。你想在Q中添加细节还是发布一个新问题?我决定在这个问题上继续用我的头撞墙,最终找到一个解决方案!最后,我把它分成了几行,这样我可以更好地想象事情,看看我的问题在哪里。基本上是为了确保我的
    如果m.start()%2==0
    高于循环的大部分。。。再次非常感谢@很抱歉,我没有跟进你的最后一个问题。很高兴你能成功。