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

在Python中对嵌套属性列表进行分组,python,list,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',

我有一张单子

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']]

您可以使用
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']]

下面是一个复杂度
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']]

我认为你想要的输出中有一个错误。问题陈述有点不清楚-我看到英语不是你的主要语言,我想帮助你澄清这个问题-并确保你得到的答案确实有效。文本显示“以“obx”开头的行将添加到以该行开头的列表中”,但输出示例将“obx”行与前一行分组。是否可以有多个不以“obx”开头的项目(例如:[“orb1”、“orca3”、…])?你的目标是将没有“obx”的行与后面所有有“obx”的行进行分组吗?请注意,标题也有误导性:问题中没有与“属性”相关的内容。您好。英语不是我的母语。我的目标是得到一个以给定字符串开头的列表列表。也就是说,我需要浏览列表。以及t后面的行以“orb”开头的行应该在给定字符串的列表中。感谢您的理解,OK,所以实际上,以“orb |”开头的行将被视为“组的开始”,接下来的所有“orb |”项都将进入一个组(任何不是“orb”的都只是添加到组中的内容。例如,这个[orb | 1,orb | 2,xyz | 7,aaa,orb | 4,ccc,orb | 5]将成为:[[orb | 1],[orb | 2,xyz | 7,aaa],[orb | 4,ccc],[orb | 5]。(注意:如果输入列表中的第一项不以“orb”开头,则不清楚该怎么办。)“,则必须跳过它。如果您有两个后续项不是以“obx”开头,则此项不起作用,例如,描述似乎暗示[“orb | 1”、“orb | 2”、“orb | 3”、“obx | 4”、“obx | 5”]应分组为[[“orb | 1”]、[“orb | 2”]、[“orb | 3”、“obx | 4”、“obx | 5”]。同样,如果您从输入中删除最后3项,IndexError也会失败。这段代码很漂亮,但它不能按我需要的方式工作。谢谢您的理解。@SerhiiYaroshevkyi正如LeoK指出的,您的问题仍然不清楚。答案具体如何不起作用?哪些案例失败?问题在于以“orb”开头的行可能会更大。因此,我得到一个错误“IndexError:列表索引超出范围”。无论如何,非常感谢。@SerhiiYaroshevkyi没问题。请发布一个示例,说明您的意思,以及所需的输出。