[英]Fastest way to split list into multiple sublists based on several conditions
根据条件将列表拆分为多个子列表的最快方法是什么?
将listOfObjects
拆分为子列表的一种方法(三个子列表用于演示,但可能还有更多):
listOfObjects = [.......]
l1, l2, l3 = [], [], []
for l in listOfObjects:
if l.someAttribute == "l1":
l1.append(l)
elif l.someAttribute == "l2":
l2.append(l)
else:
l3.append(l)
这种方式看起来一点也不像pythonic,也需要相当长的时间。 是否有更快的方法,例如使用map
?
类似的问题,但只有两个条件,没有关于速度的陈述。
您可以在此处使用collections.defaultdict
进行映射。
from collections import defaultdict
d = defaultdict(list)
for l in listOfObjects:
d[l.someAttribute].append(l)
out = d.values()
l1 , l2, l3 = d['l1'], d['l2'], d['l3']
d
将是形式。
{
attr1 : [...],
attr2 : [...],
...
attrn : [...]
}
天哪,类似问题的答案令人惊叹。 我没有考虑过拆分...无论如何,您可以做类似的事情,但可读性会降低:
for l in listOfObjects:
(l3, l2, l1)[(l.someAttribute == "l1")*2 or l.someAttribute == "l2"].append(l)
这适用于任何 boolean 条件。 or
返回第一个真值(或 False)。 True==1
,因此我们为希望等于 2 的索引添加 *2。
但正如我所说,它并不是真正可读的。
至于速度: or
短路,返回第一个真值,因此条件检查应与您的方法相似。 您可能希望将查找元组定义在循环之外。
但是:除非你做一些真正专业的事情,需要优化每一件事,否则没有什么区别。
使用 dict 更具可读性,因为您的条件基于相等(注意:您想要的属性也必须是可散列的)
lookup = {"l1": l1, "l2": l2}
for l in listOfObjects:
lookup.get(l.someAttribute, l3).append(l)
dict.get
将默认值设为第二个 - 所以它非常适合我们的 else 包罗万象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.