Python将列表拆分为给定的start/end关键字的子列表

2024-10-03 23:29:08 发布

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

如果我有一张单子,比如说

lst = ['hello', 'foo', 'test', 'world', 'bar', 'idk']

我想把它分成一个子列表,其中'foo'和{}作为起始和结束关键字,这样我就可以得到

^{pr2}$

我目前的做法如下。在

def findLoop(t):   
    inds = [index for index, item in enumerate(t) if item in ["FOO", "BAR"]]
    centre = inds[(len(inds)/2)-1:(len(inds)/2)+1]
    newCentre = t[centre[0]:centre[1]+1]
    return t[:centre[0]] + [newCentre] + t[centre[1]+1:]

def getLoops(t):
    inds = len([index for index, item in enumerate(t) if item in ["FOO", "BAR"]])
    for i in range(inds):
        t = findLoop(t)
    return t

这看起来有点混乱,但它对嵌套的start/end关键字非常有效,因此子列表可以在子列表中形成,但对于不在一起的多个start/end关键字则不起作用。嵌套并不重要,因此任何帮助都将不胜感激。在


Tags: in列表forindexleniffoodef
3条回答

一种创造性的方法是将列表转储到JSON字符串中,在需要的地方添加[和{},并将JSON字符串解析回Python嵌套列表:

import json
lst = ['hello', 'foo', 'test', 'world', 'bar', 'idk']
start_keywords = ['world', 'foo', 'test']
end_keywords = ['bar', 'idk', 'foo']
dump = json.dumps(lst)

for k in start_keywords:
    dump = dump.replace(f'"{k}"', f'["{k}"')

for k in end_keywords:
    dump = dump.replace(f'"{k}"', f'"{k}"]')

json.loads(dump)
# ['hello', ['foo'], ['test', ['world', 'bar'], 'idk']]
json.loads(dump)[2][1][0]
# 'world'

它的优点是易于理解,对任意嵌套列表都能很好地工作,并且可以检测结构是否不正确。不过,您需要确保您的单词不包含"。在

多起点,多终点(基于马克·托洛宁的回答)

lst = ['hello', 'foo', 'test', 'world', 'bar', 'idk','am']
t = [('foo','test'),('world','idk')]

def sublists(lst, t):
    for start,end in t:
        a=lst.index(start)
        b=lst.index(end)+1
        lst[a:b] = [lst[a:b]]
    return lst

print(sublists(lst,t)) 

退货:

^{pr2}$

单向使用切片:

>>> lst = ['hello', 'foo', 'test', 'world', 'bar', 'idk']
>>> a=lst.index('foo')
>>> b=lst.index('bar')+1
>>> lst[a:b] = [lst[a:b]]
>>> lst
['hello', ['foo', 'test', 'world', 'bar'], 'idk']

相关问题 更多 >