繁体   English   中英

根据多个条件将列表拆分为多个子列表的最快方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM