在Python中,您可以通过调用range(x,y)
来获取范围内的数字。但给定两个范围,比如说5-15
和10-20
你怎样才能得到所有的数字5-20
没有重复?范围也可能不相交。给定一串数字范围,获得这些范围内的所有数字?
我可以将所有结果连接起来,然后将列表单独化,但这是最快的解决方案吗?
在Python中,您可以通过调用range(x,y)
来获取范围内的数字。但给定两个范围,比如说5-15
和10-20
你怎样才能得到所有的数字5-20
没有重复?范围也可能不相交。给定一串数字范围,获得这些范围内的所有数字?
我可以将所有结果连接起来,然后将列表单独化,但这是最快的解决方案吗?
>>> a = range(5, 15)
>>> b = range(10, 20)
>>> print sorted(set(a + b))
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
或者,如果你想要的清单对他们的元素更广泛的扩展列入集:
>>> list_of_lists = [a, b]
>>> print sorted(set(elem for l in list_of_lists for elem in l))
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
而且我找到了一种方法来编写这一切在同一行:
>>> list_of_lists = [a, b]
>>> print set.union(*map(set, list_of_lists))
需要排序吗?这只是说明文,但我不认为这一定是设置输出的排序顺序:通过增加X值
>>> x = set(range(3))
>>> x
set([0, 1, 2])
>>> x.add(-1)
>>> x
set([0, 1, 2, -1])
哦......我没有考虑使用套件。太好了! – mpen
该解决方案非常好,可以理解。不知道它是快还是最快*,但这不应该是第一个担心。 –
@Mark - 也可以看一下'set.union',不过如果你从列表开始,最简单的就是“连接和分离”。如果你正在计算相同x个列表的多个组合的联合,那么让它们设置和使用'union'会更有意义。 –
排序范围(X,Y)。现在,对于每个范围,如果它与前一范围重叠,请将当前“大范围”的值设置为当前范围的和值。如果没有,开始一个新的“大范围”:这一个不会重叠任何以前的。如果当前范围完全包含在当前大范围内,请忽略它。
这听起来像是可行的。太好了! – mpen
对于你需要我只想保持简单
>>> a = range(5, 15)
>>> b = range(10, 20)
>>> from itertools import chain
>>> sorted(set(chain.from_iterable(list_of_lists)))
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
或者你也可以加入重叠范围的数量:我是一个有点困惑...什么操作都是你想要
>>> def join_overlapping_ranges(ranges):
... list_of_ranges = []
... # ranges are sorted on first element
... for r in sorted(ranges):
... # ranges are stored as [start, end]
... if list_of_ranges and list_of_ranges[-1][1] >= r[0]:
... list_of_ranges[-1][1] = r[1]
... else:
... list_of_ranges.append(r)
... return list_of_ranges
...
>>> ranges = [[3,4], [5,7], [1,2], [4,6], [5,5]]
>>> print sorted(ranges)
[[1, 2], [3, 4], [4, 6], [5, 5], [5, 7]]
>>> print join_overlapping_ranges(ranges)
[[1, 2], [3, 7]]
听起来像@IVlad的解决方案。感谢您的实施:) – mpen
这是一个编程问题,用于在我目前的公司面试。这是预期的答案,但在我看来,我给你的第一个代码更简单易懂。 – hughdbrown
那么为什么这是预期的答案?如果速度不重要,简单性通常会更好。 – mpen
? “连接所有的结果,然后单独列表”不会给你'10-20'。你的问题中有错别字吗? –
@Joe:是的,有。我的意思是'5-20'。通过“concatenate”,我的意思是'myuniquefunction(range(5,16)+ range(10,21))'会给我想要的结果。 (增加+1以包含最大值)。 – mpen
你需要多快?除非这种情况出现在有很多迭代的计算的内部循环中,否则范围很大,那么@hughdbrown给出的答案就足够了,pythonic可以启动。 – Whatang