使用 1 个列表理解而不是 3 个使用 Enumerate Python 组合两个不同的索引搜索

edo*_*101 0 python python-3.x

嗨,我想知道是否可以在一个列表条件中运行两个不同的枚举条件:

mlist = ['a', 'boy 808', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'a', 'boy 808', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']

loc = [(a,b), a for a, b for b, zip(x in enumerate(mlist), y in enumerate (mlist)) if '808' in x, if 'd' in y]
print(loc)
Run Code Online (Sandbox Code Playgroud)

这可能吗?我尝试了上面的方法,但出现了无效的语法错误:

 File "c:\Users\sys_nsgprobeingestio\Documents\dozie\odfs\ctests.py", line 118
    loc = [(a,b), a for a, b for b, zip(x in enumerate(mlist), y in enumerate (mlist)) if '808' in x, if 'd' in y]
                      ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我想获得所需的输出:[(1,3), (12,14)] 澄清一下,这只是一个示例数组。此逻辑将用于具有多次出现关键字的大文件。这里的单词开始和结束文件的一个部分。我希望得到每个部分的头部和尾部的有序对

每次出现的有序元组列表

我能够使用 3 种不同的列表理解来获得我需要的东西。我想知道你是否可以做到这一点

mlist = ['a', 'boy 808', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'a', 'boy 808', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']

blist = [i for i,x in enumerate(mlist) if 'boy' in x ]
dlist = [i for i,x in enumerate(mlist) if 'd' in x ]

tuplist = [(a,b) for a, b in zip((x for x in blist), (y for y in dlist)) ]
print(tuplist)
Run Code Online (Sandbox Code Playgroud)

Nic*_*ick 5

您可以简单地列出zip您的blistdlist

mlist = ['a', 'boy 808', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'a', 'boy 808', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']

tuplist = list(zip([i for i,x in enumerate(mlist) if 'boy' in x],
                   [i for i,x in enumerate(mlist) if 'd' in x]
                  )
              )
print(tuplist)
Run Code Online (Sandbox Code Playgroud)

输出:

[(1, 3), (12, 14)]
Run Code Online (Sandbox Code Playgroud)

如果boy值总是与d值交错,您可以通过一次检查两个值来将理解减少到 1 :

dlist = [i for i, x in enumerate(mlist) if 'boy' in x or 'd' in x]
tuplist = list(zip(dlist[::2], dlist[1::2]))
print(tuplist)
Run Code Online (Sandbox Code Playgroud)