给定一个列表[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)
我不认为这是一个很好的方法.有什么建议吗?
由于您的输入已排序,您可以使用以下命令一次性完成此操作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)