在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