使用Python将列表切割为基于特殊字符的嵌套列表

时间:2017-06-27 00:21:53

标签: python windows

我有一个像这样的字符串列表:

lst = ['23532','user_name=app','content=123',
       '###########################',
       '54546','user_name=bee','content=998 hello','source=fb',
       '###########################',
       '12/22/2015']

我想要一个像string.split('#')这样的类似方法,可以给我这样的输出:

[['23532','user_name=app','content='123'],
 ['54546','user_name=bee',content='998 hello','source=fb'],
 ['12/22/2015']]

但我知道列表没有拆分属性。我也不能使用''.join(lst),因为这个列表来自我读入的txt文件的一部分而且我的txt.file太大了,所以它会给我带来内存错误

4 个答案:

答案 0 :(得分:1)

我不认为这是一个单行,但你可以轻松写一个generator来做你想做的事情:

def sublists(lst):
    x = []
    for item in lst:
        if item == '###########################':     # or whatever condition you like
            if x:
                yield x
            x = []
        else:
            x.append(item)
    if x:
        yield x

new_list = list(sublists(old_list))

答案 1 :(得分:0)

如果你不能使用.join(),你可以遍历list并保存包含#的任何字符串的索引,然后再次循环以对列表进行切片:

lst = ['23532', 'user_name=app', 'content=123', '###########################' ,'54546','user_name=bee','content=998 hello','source=fb','###########################','12/22/2015']
idx = []
new_lst = []
for i,val in enumerate(lst):
    if '#' in val:
        idx.append(i)
j = 0
for x in idx:
    new_lst.append(lst[j:x])
    j = x+1
new_lst.append(lst[j:])
print new_lst

输出:

[['23532', 'user_name=app', 'content=123'], ['54546', 'user_name=bee', 'content=998 hello', 'source=fb'], ['12/22/2015']]

答案 2 :(得分:0)

sep = '###########################'

def split_list(_list):
    global sep
    lists = list()
    sub_list = list()
    for x in _list:
        if x == sep:
            lists.append(sub_list)
            sub_list = list()
        else:
            sub_list.append(x)
    lists.append(sub_list)
    return lists

l = ['23532','user_name=app','content=123',
     '###########################',
     '54546','user_name=bee','content=998 hello','source=fb',
     '###########################',
     '12/22/2015']

pprint(split_list(l))

输出:

[['23532', 'user_name=app', 'content=123'],
 ['54546', 'user_name=bee', 'content=998 hello', 'source=fb'],
 ['12/22/2015']]

答案 3 :(得分:0)

您可以通过itertools.groupby

实现这一目标
from itertools import groupby
lst = ['23532','user_name=app','content=123',
     '###########################','54546','user_name=bee','content=998 hello','source=fb',
     '###########################','12/22/2015'] 

[list(g) for k, g in groupby(lst, lambda x: x == '###########################')  if not k ]

输出

[['23532', 'user_name=app', 'content=123'],
 ['54546', 'user_name=bee', 'content=998 hello', 'source=fb'],
 ['12/22/2015']]