Python检索lis中标记之间的嵌套值列表

2024-10-01 22:36:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份清单:

[2,3,5,"TAG",6,7,3,2,6,"TAG",9,9,8,3]

我想返回一个列表,其中包含位于“标记”之间的值的嵌套子列表

因此,生成的列表如下所示:

[[2,3,5], [6,7,3,2,6], [9,9,8,3]]

我在下面创建了一个方法,试图实现这一点,但不起作用:

def returnListBetweenTag(lst, tag):
  temp = []
  k = lst.index(tag)
  while lst != []:
      temp.append(lst[0:k])
      del lst[0:k+1]
  return temp

打印出来:

[[2, 3, 5], [6, 7, 3], [6, 'TAG', 9], [8, 3]]

有谁能帮我理解我做错了什么,并提出一些解决的建议吗


Tags: 方法标记列表indexreturndeftagtemp
3条回答

这里有一个用^{}实现的方法

from itertools import groupby

ls = []

for key, group in groupby(lst, lambda x: x != "TAG"):
    if key:
        ls.append(list(group))

print ls
# [[2, 3, 5], [6, 7, 3, 2, 6], [9, 9, 8, 3]]

这也可以理解为:

ls = [list(group) for key, group in groupby(lst, lambda x: x != "TAG") if key]

这确实不是一个好方法,但是你可以让它工作

首先,在第一次之后再也不做k = lst.index(tag)。 所以,在你的列表中,k变成了永远的3。但是你总是把前三个元素从列表中去掉,所以首先k[0:3][2, 3, 5],然后是[6, 7, 3],然后是3,[6, 'TAG', 9],依此类推。你每次都得打电话

第二,当列表中没有更多的'TAG'时会发生什么?lst.index将引发异常。所以你得处理好

def returnListBetweenTag(lst, tag):
    temp = []
    while lst != []:
        try:
            k = lst.index(tag)
        except ValueError:
            temp.append(lst)
            break
        temp.append(lst[0:k])
        del lst[0:k+1]
    return temp

当使用generator时,这是相当直接的:

代码:

def divide_list(a_list, divider):
    sub_list = []
    for item in a_list:
        if item == divider:
            yield sub_list
            sub_list = []
        else:
            sub_list.append(item)
    yield sub_list

测试代码:

data = [2,3,5,"TAG",6,7,3,2,6,"TAG",9,9,8,3]
print(list(divide_list(data, "TAG")))

结果:

[[2, 3, 5], [6, 7, 3, 2, 6], [9, 9, 8, 3]]

相关问题 更多 >

    热门问题