我想知道Python中是否已经为我稍后描述的目标编写了一个函数。如果没有,什么是最容易实现的方式。我的密码附上去了。
假设我的范围从1到999999999。给出了如下数字的列表:
[9, 44, 99]它会回来的
[(1,9), (10,44), (45,99), (100, 999999999)]如果输入数字中包含有限制的数字,那么它也应该处理这个问题。假设输入是
[1, 9, 44, 999999999]回报应是:
[(1,9), (10,44), (45, 999999999)]与一些条件语句相比,我可以编写一个for循环,但我想知道是否有一种更“明智的方法”。
一些数据按摩可能会有帮助:
points = [1, 9, 44, 99]
points = sorted(list(set(points + [1, 999999999])))更新信息:给alecxe的最后学分,谢谢您鼓舞人心的列表理解解决方案。
l = sorted(list(set(points + [1, 999999999])))
[(l[i] + int(i != 0), l[i + 1]) for i in xrange(len(l) - 1)]你可以把所有这些放在一起,但我认为这是不必要的。
发布于 2016-11-08 16:51:40
pandas.cut()
示例
[1,2,3,4,5,6,7,8,9,10] ---> [A,A,B,B,C,C,D,D,E,E]R:
x <- seq(1,10,1)
cut(x, breaks = seq(0,10,2), labels = c('A','B','C','D','E'))Python:
import pandas
x = range(1, 11, 1)
pandas.cut(x, bins=range(0, 12, 2), labels=['A','B','C','D','E'])发布于 2013-08-30 18:06:15
def myCut(low, high, points):
answer = []
curr = low
for point in points:
answer.append((curr, point))
curr = point + 1
answer.append((curr, high))
return answer
>>> low = 1
>>> high = 999999999
>>> points = [9, 44, 109]
>>> myCut(low, high, points)
[(1, 9), (10, 44), (45, 109), (110, 999999999)]在这个答案和随后的讨论的启发下,这里有一个使用itertools的较少行的解决方案。这使用itertools.chain和itertools.izip (在python2.7中;zip在python3.x中)来减少添加列表、排序和序列化所带来的时间和空间复杂性。请注意,该解决方案假定输入列表已经排序,否则将产生错误的结果。
cuts = [(i+1, j) for i,j in itertools.izip(itertools.chain([0], myList), itertools.chain(myList, [999999999]))]
>>> import itertools
>>> myList = [9, 44, 99]
>>> [(i+1, j) for i,j in itertools.izip(itertools.chain([0], myList), itertools.
chain(myList, [999999999]))]
[(1, 9), (10, 44), (45, 99), (100, 999999999)]发布于 2013-08-30 18:06:22
不确定这种方法是最好的方法:
>>> l = [1, 9, 44, 999999999]
>>> [(l[i] + int(i != 0), l[i + 1]) for i in xrange(len(l) - 1)]
[(1, 9), (10, 44), (45, 999999999)]如果您在python 3上,请将xrange替换为range。
请注意,要使第一个示例正常工作,您需要先添加并附加边界:
>>> l = [9, 44, 109]
>>> low, high = 1, 999999999
>>> l = [low] + l + [high]
>>> [(l[i] + int(i != 0), l[i + 1]) for i in xrange(len(l) - 1)]
[(1, 9), (10, 44), (45, 109), (110, 999999999)]https://stackoverflow.com/questions/18538920
复制相似问题