Mam tę listę łańcuchów takich jak:

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

Chcę podobną metodę, jak string.split ("# '), który może dać mi wyjście:

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

Ale znam listę nie jest podzielony atrybut. Nie mogę używać ''.join(lst) albo dlatego, że ta lista pochodzi z części pliku TXT, w którym przeczytałem, a mój txt.file był zbyt duży, więc rzuci błąd Memory Error dla mnie.

2
Cocoa Wang 27 czerwiec 2017, 03:21

4 odpowiedzi

Najlepsza odpowiedź

Nie sądzę, że jest dla tego jeden wkładka, ale możesz łatwo napisać generator Aby robić to, co chcesz:

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
rlbond 27 czerwiec 2017, 00:37
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))

Wynik:

[['23532', 'user_name=app', 'content=123'],
 ['54546', 'user_name=bee', 'content=998 hello', 'source=fb'],
 ['12/22/2015']]
0
glegoux 27 czerwiec 2017, 00:45

Możesz osiągnąć to przez 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 ]

Wynik

[['23532', 'user_name=app', 'content=123'],
 ['54546', 'user_name=bee', 'content=998 hello', 'source=fb'],
 ['12/22/2015']]
0
Transhuman 27 czerwiec 2017, 02:51

Jeśli nie możesz użyć .join(), możesz pętli przez list i zapisać indeks dowolnego ciągu, który zawiera #, a następnie ponownie pętla, aby pokroić 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

Wynik:

[['23532', 'user_name=app', 'content=123'], ['54546', 'user_name=bee', 'content=998 hello', 'source=fb'], ['12/22/2015']]
0
Mohd 27 czerwiec 2017, 00:43