按对象类型拆分包含对象的python列表
我尝试了以下方法,似乎效果不错。问题是这是蟒蛇式的方式吗?我的实际代码是非常复杂的继承。我正在尝试检查并将更新。谢谢按对象类型拆分包含对象的python列表,python,python-3.x,list,Python,Python 3.x,List,我尝试了以下方法,似乎效果不错。问题是这是蟒蛇式的方式吗?我的实际代码是非常复杂的继承。我正在尝试检查并将更新。谢谢 class A: def __repr__(self): return "A" class B: def __repr__(self): return "B" class C: def __repr__(self): return "C" def split_by_type(object_list, o
class A:
def __repr__(self):
return "A"
class B:
def __repr__(self):
return "B"
class C:
def __repr__(self):
return "C"
def split_by_type(object_list, obj_type):
final, inter = [], []
for obj in object_list:
if isinstance(obj, obj_type):
if inter:
final.append(inter)
inter = [obj]
else:
inter.append(obj)
final.append(inter)
return final
输入:[A1、B1、C1、A2、B2、A3、C3、A4、B4、C4]
输出:[[A1,B1,C1],[A2,B2],[A3,C3],[A4,B4,C4]
object_list = [A(), B(), C(), A(), B(), A(), C(), A(), B(), C()]
print(split_by_type(object_list, A)) # ==> [[A, B, C], [A, B], [A, C], [A, B, C]]
您可以使用
itertools.groupby
和itertools.count
:
object_list = [A(), B(), C(), A(), B(), A(), C(), A(), B(), C()]
from itertools import groupby, count
c = count()
out = [[o[1] for o in g] for v, g in groupby(enumerate(object_list), lambda o: o[0]-[next(c), next(c)][-1] if isinstance(o[1], A) else o[0]-next(c))]
print(out)
印刷品:
[[A, B, C], [A, B], [A, C], [A, B, C]]
如果您想了解如何改进代码,请尝试:我问这个问题是因为我没有解决方案。然后我想不试着问是不好的。然后我试了一下。我不知道这是否会奏效。对于示例代码,它正在工作。谢谢如果没有人感兴趣,我会采取行动。这对我来说没问题,所以你目前的方法没问题,那么我think@NathanMcCoy您将解析到
groupby
的key
函数是什么?(lambda x:isinstance(x,obj_类型))
当然不起作用)感谢您理解我的问题并提供帮助。还有一个问题。如何在外部访问内部列表中的变量o
[o[1]来表示o in g]?这是因为副作用还是正常行为。我闻到了一种我从未理解的结束的味道。@Rahul没有结束groupby()
返回两个变量v
->分组和迭代器g
中使用的键。我只是在列表理解中迭代g
,并从元组中提取第二个元素(注意groupby()
中的enumerate()
)哦!。我懂了。由于在lambda中再次重用变量o
,我感到困惑。因此,在[o[1]中的o
与lambda o:o[0]…
不同。是吗?@Rahul是的,他们是不同的。