Группировать последовательные похожие элементы в списке Python - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть список, содержащий разные типы данных, скажем, числа и строки:

foo = [5,2,'a',8,4,'b','y',9, 'd','e','g']

Допустим, я хочу найти все последовательные строки в списке и сгруппировать их вместе:

bar = [ ['a'],['b','y'],['d','e','g'] ]

Как я могу это сделать

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Итерируйте по каждому элементу в списке, если он имеет тип str, добавьте его к one_d_array, в противном случае добавьте one_d_array к two_d_array, если one_d_array не пусто. Сброс one_d_array, если элемент не относится к типу str

lst = [5,2,'a',8,4,'b','y',9, 'd','e','g', 3]
ind = 0
two_d_arr = []
one_d_arr = []
while(ind < len(lst)):
    cur_element = lst[ind]
    if(isinstance(cur_element, str) == True):
        one_d_arr.append(cur_element)
    else:
        if(len(one_d_arr) != 0):
            two_d_arr.append(one_d_arr)
        one_d_arr = []
    ind = ind+1
if(len(one_d_arr) != 0):
            two_d_arr.append(one_d_arr)
print(two_d_arr)
0 голосов
/ 06 сентября 2018

Не используя импорт, вы можете сделать это с помощью старого доброго цикла for, перебирающего элементы списков. Вот код, работающий также для любого типа, который вы хотите, а не только для строки:

def group_list(a_list, a_type):
    res = []
    sublist = []
    for elem in a_list:
        if isinstance(elem, a_type):
            # Here the element is of  type a_type: append it to a sublist
            sublist.append(elem)
        else:
            # Here the element is not of type a_type: append the sublist (if not empty) to the result list
            if sublist:
                res.append(sublist)
                sublist = []
    # If the last element of the list is of type a_type, the last sublist has not been appended: append it now
    if sublist:
        res.append(sublist)

    return res


foo = [5,2,'a',8,4,'b','y',9, 'd','e','g']
print(group_list(foo,str)) 
# [['a'], ['b', 'y'], ['d', 'e', 'g']]
0 голосов
/ 06 сентября 2018

Это прекрасная возможность использовать groupby:

from itertools import groupby


foo = [5,2,'a',8,4,'b','y',9, 'd','e','g']
bar = [list(g) for k, g in groupby(foo, key=lambda x: isinstance(x, str)) if k]

, который производит желаемое:

[['a'], ['b', 'y'], ['d', 'e', 'g']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...