Группировка списка вложенных атрибутов в Python - PullRequest
0 голосов
/ 26 июня 2018

У меня есть список

lst = ['orb|2|3|4', 'obx|2|3|4', 'orb|2|3|4', 'obx|1|2|3', 'obx|1|2|3','obx|1|2|3']

Как я могу сгруппировать список по начальным трем строкам, чтобы в итоге это было так. Группировка происходит по трем символам строки. Если строка начинается с «orb», то последующие строки добавляются в список, который начинается с этой строки. Спасибо за ответ.

result = [['orb|2|3|4', 'obx|2|3|4'], ['orb|2|3|4', 'obx|1|2|3', 'obx|1|2|3','obx|1|2|3']]

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вот алгоритм O(N) сложности:

res = []
tmp = []
for x in lst:
    if x.startswith('orb'):
        if tmp:
            res.append(tmp)
        tmp = [x]
    elif tmp:
        tmp.append(x)
res.append(tmp)

результат:

In [133]: res
Out[133]:
[['orb|2|3|4', 'obx|2|3|4'],
 ['orb|2|3|4', 'obx|1|2|3', 'obx|1|2|3', 'obx|1|2|3']]
0 голосов
/ 26 июня 2018

Вы можете использовать itertools.groupby:

import itertools, re
lst = ['orb|2|3|4', 'obx|2|3|4', 'orb|2|3|4', 'obx|1|2|3', 'obx|1|2|3','obx|1|2|3']
new_result = [list(b) for _, b in itertools.groupby(lst, key=lambda x:re.findall('^\w+', x)[0])]
final_result = [new_result[i]+new_result[i+1] for i in range(0, len(new_result), 2)]

Выход:

[['orb|2|3|4', 'obx|2|3|4'], ['orb|2|3|4', 'obx|1|2|3', 'obx|1|2|3', 'obx|1|2|3']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...