首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python "R Cut“函数

Python "R Cut“函数
EN

Stack Overflow用户
提问于 2013-08-30 18:01:19
回答 4查看 5.2K关注 0票数 6

我想知道Python中是否已经为我稍后描述的目标编写了一个函数。如果没有,什么是最容易实现的方式。我的密码附上去了。

假设我的范围从1到999999999。给出了如下数字的列表:

代码语言:javascript
复制
[9, 44, 99]

它会回来的

代码语言:javascript
复制
[(1,9), (10,44), (45,99), (100, 999999999)]

如果输入数字中包含有限制的数字,那么它也应该处理这个问题。假设输入是

代码语言:javascript
复制
[1, 9, 44, 999999999]

回报应是:

代码语言:javascript
复制
[(1,9), (10,44), (45, 999999999)]

与一些条件语句相比,我可以编写一个for循环,但我想知道是否有一种更“明智的方法”。

一些数据按摩可能会有帮助:

代码语言:javascript
复制
points = [1, 9, 44, 99]
points = sorted(list(set(points + [1, 999999999])))

更新信息:给alecxe的最后学分,谢谢您鼓舞人心的列表理解解决方案

代码语言:javascript
复制
l = sorted(list(set(points + [1, 999999999])))
[(l[i] + int(i != 0), l[i + 1]) for i in xrange(len(l) - 1)]

你可以把所有这些放在一起,但我认为这是不必要的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-08 16:51:40

pandas.cut()

示例

代码语言:javascript
复制
[1,2,3,4,5,6,7,8,9,10] ---> [A,A,B,B,C,C,D,D,E,E]

R:

代码语言:javascript
复制
x  <- seq(1,10,1)
cut(x, breaks = seq(0,10,2), labels = c('A','B','C','D','E'))

Python:

代码语言:javascript
复制
import pandas
x = range(1, 11, 1)
pandas.cut(x, bins=range(0, 12, 2), labels=['A','B','C','D','E'])
票数 21
EN

Stack Overflow用户

发布于 2013-08-30 18:06:15

代码语言:javascript
复制
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.chainitertools.izip (在python2.7中;zip在python3.x中)来减少添加列表、排序和序列化所带来的时间和空间复杂性。请注意,该解决方案假定输入列表已经排序,否则将产生错误的结果。

代码语言:javascript
复制
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)]
票数 1
EN

Stack Overflow用户

发布于 2013-08-30 18:06:22

不确定这种方法是最好的方法:

代码语言:javascript
复制
>>> 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

请注意,要使第一个示例正常工作,您需要先添加并附加边界:

代码语言:javascript
复制
>>> 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)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18538920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档