I have a list containing data such as [2, 3, 9, 10, 16, 17, 23, 24, 99, 112, 113, 114, 299]
and what I would is that, for every set of consecutive numbers, construct a dictionary with the key representing the set of consecutive numbers starting from 1, and the value the consecutive numbers.
The expected output should look like this:
{1: [2, 3], 2: [9, 10], 3: [16, 17], 4: [23, 24], 5: [99], 6: [112, 113, 114], 7: [299]}
Is there an efficient way of doing this?
Advertisement
Answer
The following code will do what you want:
def splitCons(lst): retlst = {} # Keep empty dict unless there are items. if len(lst) > 0: # Populate first keyed item with first element. key = 1 retlst = {key:[lst[0]]} # Process other elements. for num in lst[1:]: # Consecutive to previous? Add to existing. Otherwise, add to new. if num == retlst[key][-1] + 1: retlst[key].append(num) else: key += 1 retlst[key] = [num] return retlst print(splitCons([2, 3, 9, 10, 16, 17, 23, 24, 99, 112, 113, 114, 299]))
It simply creates the dictionary and either adds elements to the current last key (if consecutive) or starts a new key (if not).
Output for the test data in the given script (slightly modified to show correct operation where sets are not always pairs), and formatted for readability:
{ 1: [2, 3], 2: [9, 10], 3: [16, 17], 4: [23, 24], 5: [99], 6: [112, 113, 114], 7: [299] }