Thank you very much! On Saturday, January 18, 2025 at 4:36:50 PM UTC+2 [email protected] wrote:
> For the first question, to sort the intervals according to right bounds, > you can use python sort function with custom key function. > > intervals = [Interval(1,5), Interval(1,2)] > sorted(intervals, key=lambda interval: (interval.left, interval.right)) > > The idea of the function is that Python compares tuples according to > lexicographical order > > (1, 2) < (1, 3) > (1, 2) < (2, 1) > > so simply embedding into a tuple is equivalent to the logic to sort > according to the left side, and then sort according to the right side. > > I can answer the second question by time to time, because providing > working code is more involved. But the general idea is that > > 1. Identify the list of endpoints of the intervals. For example, you > can put into a list or a set. Set could be a good idea if you want to > remove syntactic duplicates. From [Interval(1,2), Interval(1,5), > Interval(2,3)] > 2. From the sorted list of endpoints ([1, 2, 3, 5]), you can break > down into a list of intervals. The desired result should be [1, 2], [2, > 3], > [3, 5]. You can use Python zip function with list slicing to break down > the > list like that, example, zip(l[:-1], l[1:]). > 3. Compute the union of intervals. You can use Python | operator to > compute the unions of sets. From the given list of > intervals [Interval(1,2), Interval(1,5), Interval(2,3)], the union should > be Interval(1, 5). > 4. From the intervals that were computed from step 2: Interval(1, 2), > Interval(2, 3), Interval(3, 5). You should check if each broken down > intervals are subset of the union computed from step 3. In this simple > example, every broken down intervals are already contained in the union. > You can use the function issubset. > > I note that the question is a bit ambiguous, and if you take account of > more complexity, like open-closedness of intervals, or symbolic numbers > which can make comparison difficult, the solution can be different. But I > expect that the general answer should be similar. > On Tuesday, January 14, 2025 at 10:45:06 PM UTC+1 [email protected] > wrote: > >> I have a list of closed intervals sorted in ascending order by the left >> bound. >> >> For example, [Interval(1,2), Interval(1,5)]. There is no sorting by right >> bouns, so [Interval(1,5), Interval(1,2)] is also possible. >> >> I want to get list of disjoint closed intervals. For example, >> [Interval(1,2), Interval(1,5), Interval(2,3)] should become >> [Interval(1,2), Interval(2,3), Interval(3,5)] (again sorted by the left >> bound). >> >> What is the best way to do it? Will the problem become harder if the list >> is unsorted? >> >> Thank you. >> > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/sympy/c01eae41-3e23-4f60-9331-435aa1b283ban%40googlegroups.com.
