在Python中对嵌套的属性列表进行分组

时间:2018-06-26 18:25:22

标签: python list

我有一个清单

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 :(得分:1)

这是一种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']]

答案 1 :(得分:0)

您可以使用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']]
相关问题