Upload TMIDIX.py
Browse files
TMIDIX.py
CHANGED
@@ -51,7 +51,7 @@ r'''############################################################################
|
|
51 |
|
52 |
###################################################################################
|
53 |
|
54 |
-
__version__ = "25.8.
|
55 |
|
56 |
print('=' * 70)
|
57 |
print('TMIDIX Python module')
|
@@ -13695,6 +13695,105 @@ def flip_list_columns(lst):
|
|
13695 |
|
13696 |
###################################################################################
|
13697 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13698 |
print('Module loaded!')
|
13699 |
print('=' * 70)
|
13700 |
print('Enjoy! :)')
|
|
|
51 |
|
52 |
###################################################################################
|
53 |
|
54 |
+
__version__ = "25.8.21"
|
55 |
|
56 |
print('=' * 70)
|
57 |
print('TMIDIX Python module')
|
|
|
13695 |
|
13696 |
###################################################################################
|
13697 |
|
13698 |
+
def exists(sub, lst):
|
13699 |
+
sub_len = len(sub)
|
13700 |
+
return any(lst[i:i + sub_len] == sub for i in range(len(lst) - sub_len + 1))
|
13701 |
+
|
13702 |
+
###################################################################################
|
13703 |
+
|
13704 |
+
def exists_noncontig(sub, lst):
|
13705 |
+
it = iter(lst)
|
13706 |
+
return all(x in it for x in sub)
|
13707 |
+
|
13708 |
+
###################################################################################
|
13709 |
+
|
13710 |
+
def exists_ratio(sub, lst, ratio):
|
13711 |
+
matches = sum(x in set(lst) for x in sub)
|
13712 |
+
return matches / len(sub) >= ratio
|
13713 |
+
|
13714 |
+
###################################################################################
|
13715 |
+
|
13716 |
+
def chunk_by_threshold_mode(nums, threshold=0, normalize=False):
|
13717 |
+
|
13718 |
+
if not nums:
|
13719 |
+
return []
|
13720 |
+
|
13721 |
+
chunks = []
|
13722 |
+
chunk = []
|
13723 |
+
freq = defaultdict(int)
|
13724 |
+
max_freq = 0
|
13725 |
+
mode_val = None
|
13726 |
+
|
13727 |
+
def try_add_and_validate(value):
|
13728 |
+
|
13729 |
+
nonlocal max_freq, mode_val
|
13730 |
+
|
13731 |
+
chunk.append(value)
|
13732 |
+
freq[value] += 1
|
13733 |
+
new_max_freq = max_freq
|
13734 |
+
candidate_mode = mode_val
|
13735 |
+
|
13736 |
+
if freq[value] > new_max_freq:
|
13737 |
+
new_max_freq = freq[value]
|
13738 |
+
candidate_mode = value
|
13739 |
+
|
13740 |
+
mode = candidate_mode
|
13741 |
+
valid = True
|
13742 |
+
|
13743 |
+
for v in chunk:
|
13744 |
+
if abs(v - mode) > threshold:
|
13745 |
+
valid = False
|
13746 |
+
break
|
13747 |
+
|
13748 |
+
if not valid:
|
13749 |
+
|
13750 |
+
chunk.pop()
|
13751 |
+
freq[value] -= 1
|
13752 |
+
if freq[value] == 0:
|
13753 |
+
del freq[value]
|
13754 |
+
|
13755 |
+
return False
|
13756 |
+
|
13757 |
+
max_freq = new_max_freq
|
13758 |
+
mode_val = mode
|
13759 |
+
return True
|
13760 |
+
|
13761 |
+
for num in nums:
|
13762 |
+
if not chunk:
|
13763 |
+
chunk.append(num)
|
13764 |
+
freq[num] = 1
|
13765 |
+
mode_val = num
|
13766 |
+
max_freq = 1
|
13767 |
+
|
13768 |
+
else:
|
13769 |
+
if not try_add_and_validate(num):
|
13770 |
+
if normalize:
|
13771 |
+
normalized_chunk = [mode_val] * len(chunk)
|
13772 |
+
chunks.append(normalized_chunk)
|
13773 |
+
|
13774 |
+
else:
|
13775 |
+
chunks.append(chunk[:])
|
13776 |
+
|
13777 |
+
chunk.clear()
|
13778 |
+
freq.clear()
|
13779 |
+
|
13780 |
+
chunk.append(num)
|
13781 |
+
freq[num] = 1
|
13782 |
+
mode_val = num
|
13783 |
+
max_freq = 1
|
13784 |
+
|
13785 |
+
if chunk:
|
13786 |
+
if normalize:
|
13787 |
+
normalized_chunk = [mode_val] * len(chunk)
|
13788 |
+
chunks.append(normalized_chunk)
|
13789 |
+
|
13790 |
+
else:
|
13791 |
+
chunks.append(chunk)
|
13792 |
+
|
13793 |
+
return chunks
|
13794 |
+
|
13795 |
+
###################################################################################
|
13796 |
+
|
13797 |
print('Module loaded!')
|
13798 |
print('=' * 70)
|
13799 |
print('Enjoy! :)')
|