用条件切片列表的优雅方法

haj*_*muz 5 python list

给定一个列表[2,8,13,15,24,30],其中所有元素都应该在范围内(31).现在我想把它分成3个列表,第一个列表的数字从0到10,第二个列表的数字从11到20,其他的到其余的.

这是我丑陋的代码:

numbers = [2,8,13,15,24,30]
mylist = [[],[],[]] # I hate this the most...
for i in numbers:
    if i <= 10 :
        mylist[0].append(i)
    elif i > 10 and i <= 20:
        mylist[1].append(i)
    else:
        mylist[2].append(i)

print mylist
Run Code Online (Sandbox Code Playgroud)

我不认为这是一个很好的方法.有什么建议吗?

roi*_*ppi 3

由于您的输入已排序,您可以使用以下命令一次性完成此操作itertools.groupby

from itertools import groupby

[list(g) for _,g in groupby(numbers, lambda x: x//10)]
Out[3]: [[2, 8], [13, 15], [24, 26]]
Run Code Online (Sandbox Code Playgroud)

不需要以这种方式初始化一堆列表,groupby可以动态生成它们。

就您想要如何处理模 10 边界而言,这可能会相差 1;如果不清楚您可以随时定义自己的grouper函数:

def grouper(x):
    '''bins matching the semantics:
    [0,10] (10,20] (20, 30]'''
    return (x-1)//10 if x > 0 else 0
Run Code Online (Sandbox Code Playgroud)

并这样使用它:

numbers = [2,8,13,15,24,30]

[list(g) for _,g in groupby(numbers, grouper)]
Out[5]: [[2, 8], [13, 15], [24, 30]]
Run Code Online (Sandbox Code Playgroud)