繁体   English   中英

查找列表中的所有匹配项

[英]To find all matches in list

我正在尝试列出列表中某个元素的所有匹配项。 但是弄错了。 下面的代码有什么问题。

theList = ['a','e','i','o','u','e','o','e']

def matchall1(theList, value, pos=0):
    loc = pos - 1
    try:
        loc = theList.index(value, loc+1)
        yield loc
    except ValueError:
        pass

value = 'e'
for loc in matchall1(theList, value):
    print("match at", loc+1, "position.")

我从上面的代码中得到的结果只是“在2位匹配。”

就像您忘了循环一样简单:

def matchall1(theList, value, pos=0):
    loc = pos - 1
    try:
        while True:  # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            loc = theList.index(value, loc+1)
            yield loc
    except ValueError:
        pass

value = 'e'
for loc in matchall1(theList, value):
    print("match at", loc+1, "position.")

输出:

match at 2 position.
match at 6 position.
match at 8 position.

如果要查找所有匹配项,则需要某种形式的重复(迭代循环或递归)。

根据功能的签名判断,您的意图是使用递归,该递归如下所示:

def matchall_version1(theList, value, i=0):
    try:
        i = theList.index(value, i)
        yield i
        yield from matchall_version1(theList, value, i+1)
    except ValueError:
        pass

使用循环,您的代码将如下所示:

def matchall_version2(theList, value):
    i = 0
    try:
        while True:
            i = theList.index(value, i + 1)
            yield i
    except ValueError:
        pass

但是我想建议这个版本,它比您的恕我直言更具可读性:

def matchall_version3(theList, value):
    for i, x in enumerate(theList):
        if x == value:
            yield i

所有这三个版本的结果相同。 这个:

theList = ['a','e','i','o','u','e','o','e']
print(list(matchall_version1(theList, 'e')))
print(list(matchall_version2(theList, 'e')))
print(list(matchall_version3(theList, 'e')))

打印此:

[1, 5, 7]
[1, 5, 7]
[1, 5, 7]

您可以通过列表理解来做到这一点

[index for index, letter in enumerate(theList) if letter==value]

该算法有点混乱,最好使用生成器表达式:

theList = ['a','e','i','o','u','e','o','e']
def matchAll(element, lst):
    yield from (i for i, e in enumerate(lst) if e == element)

这里有现场示例

我不会深入探讨您提出的这类问题,而是会给您一个可以帮助您解决问题的答案。

theList = ['a','e','i','o','u','e','o','e']

def matchall1(theList, value, pos=0):
    loc = pos - 1
    try:
        for items in theList:  #ADD THIS TO YOUR CODE AND YOU'LL BE GOOD
            loc = theList.index(value, loc+1)
            yield loc
    except ValueError:
        pass

value = 'e'
for loc in matchall1(theList, value):
    print("match at", loc+1, "position.")

这样可以为您提供全面的输出,即一次输出。 如果您希望所有位置都在同一输出语句中,那么建议您将其添加到列表中,然后将其传递到稍后实现的for循环中。

编辑1:我迅速添加了可以在同一条语句中输出所有位置的部分。 该代码可能看起来很讨厌,并且不是专业人士 ,但它可以工作。 看一看

theList = ['a','e','i','o','u','e','o','e']

def matchall1(theList, value, pos=0):
    loc_list = []
    loc = pos - 1
    try:
        for items in theList:
            loc = theList.index(value, loc+1)
            loc_list.append(loc)
            yield loc_list
    except ValueError:
        pass

value = 'e'
for loc in matchall1(theList, value):
    continue
new_loc = []
for x in loc:
    x+=1
    new_loc.append(x)

pos = ",".join(str(x) for x in new_loc)

print("Match at", pos, "position.")

输出:

Match at 2,6,8 position.
theList = ['a','e','i','o','u','e','o','e']

def matchall1(theList, value, pos=0):
    loc = pos - 1
    loc = [i for i, v in enumerate(theList) if v == value]
    for p in loc:
        yield p

value = 'e'
for loc in matchall1(theList, value):
    print("match at", loc+1, "position.")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM