@Neal, you have a look at the below code. I've just tried to solve your problem in my way and written one method for code reusability.
I have used the concept of panda's DataFrame for storing tabular data and accessing data efficiently.
I have stored your given data in a file named data.txt.
data.txt
PERIOD
CHANNELS 1 2 3 4 5
0 1.51 1.61 1.94 2.13 1.95
5 1.76 1.91 2.29 2.54 2.38
6 2.02 2.22 2.64 2.96 2.81
7 2.27 2.52 2.99 3.37 3.24
8 2.53 2.83 3.35 3.79 3.67
9 2.78 3.13 3.70 4.21 4.09
10 3.04 3.44 4.05 4.63 4.53
Python code
import numpy as np
import pandas as pd
def get_energy_details(file_name, period, low_energy, higher_energy, row_names=None, column_names=None):
# READ FILE AND STORE THE DATA IN 2D LIST
data_list = [] # FUTURE'S 2D LIST
with open(file_name) as f:
lines = f.readlines()[2:]
for line in lines:
arr = [float(num) for num in line.split()[1:]]
data_list.append(arr)
# PRINT 2D LIST
print (data_list, '\n')
# CREATING DataFrame FROM 2D LIST
df = pd.DataFrame(data_list, columns=column_names, index=row_names)
# PRINT DataFrame
print (df, '\n')
# SELECT THE SPECIFIC PERIOD (It is a Series object)
print (df[period])
# SORT THE SERIES AND STORE IT IN sorted_list
sorted_list = df[period].sort_values() # A Series object
# PRINT THE SORTED Series object
print (sorted_list)
# ************* MAIN LOGIC GOES HERE ****************
# ************* LOWER ENERGY ************************
found = False
low_energy_level = None
higher_energy_level = None
for i, item in enumerate(sorted_list):
print(i, item)
if low_energy_level is not None and higher_energy_level is not None:
break
if item <= low_energy:
low_energy_level = sorted_list.index[i]
if item >= higher_energy:
higher_energy_level = sorted_list.index[i]
# OUTPUT
return (low_energy_level, higher_energy_level)
# start
if __name__ == '__main__':
# INPUT 1
period1 = int(input('Enter the period: '))
lower_energy1 = float(input('Enter the lower energy value: '))
higher_energy1 = float(input('Enter the higher energy value: '))
row_names = [0, 5, 6, 7, 8, 9, 10]
column_names = [1, 2, 3, 4, 5]
energies1 = get_energy_details('data.txt', period1, lower_energy1, higher_energy1, row_names, column_names)
low_energy_level, higher_energy_level = energies1[0], energies1[1]
print('\nLower energy: ', low_energy_level, 'Higher energy: ', higher_energy_level, '\n\n');
# INPUT 2
period2 = int(input('Enter the period: '))
lower_energy2 = float(input('Enter the lower energy value: '))
higher_energy2 = float(input('Enter the higher energy value: '))
energies2 = get_energy_details('data.txt', period2, lower_energy2, higher_energy2)
low_energy_level, higher_energy_level = energies2[0], energies2[1]
print('\nLower energy: ', low_energy_level, 'Higher energy: ', higher_energy_level, '\n\n');
INPUT 1
Enter the period: 1
Enter the lower energy value: 2.02
Enter the higher energy value: 2.60
[[1.51, 1.61, 1.94, 2.13, 1.95], [1.76, 1.91, 2.29, 2.54, 2.38], [2.02, 2.22, 2.64, 2.96, 2.81], [2.27, 2.52, 2.99, 3.37, 3.24], [2.53, 2.83, 3.35, 3.79, 3.67], [2.78, 3.13, 3.7, 4.21, 4.09], [3.04, 3.44, 4.05, 4.63, 4.53]]
1 2 3 4 5
0 1.51 1.61 1.94 2.13 1.95
5 1.76 1.91 2.29 2.54 2.38
6 2.02 2.22 2.64 2.96 2.81
7 2.27 2.52 2.99 3.37 3.24
8 2.53 2.83 3.35 3.79 3.67
9 2.78 3.13 3.70 4.21 4.09
10 3.04 3.44 4.05 4.63 4.53
0 1.51
5 1.76
6 2.02
7 2.27
8 2.53
9 2.78
10 3.04
Name: 1, dtype: float64
0 1.51
5 1.76
6 2.02
7 2.27
8 2.53
9 2.78
10 3.04
Name: 1, dtype: float64
0 1.51
1 1.76
2 2.02
3 2.27
4 2.53
5 2.78
6 3.04
Lower energy: 6 Higher energy: 9
INPUT 2
Enter the period: 2
Enter the lower energy value: 2.96
Enter the higher energy value: 3.01
[[1.51, 1.61, 1.94, 2.13, 1.95], [1.76, 1.91, 2.29, 2.54, 2.38], [2.02, 2.22, 2.64, 2.96, 2.81], [2.27, 2.52, 2.99, 3.37, 3.24], [2.53, 2.83, 3.35, 3.79, 3.67], [2.78, 3.13, 3.7, 4.21, 4.09], [3.04, 3.44, 4.05, 4.63, 4.53]]
0 1 2 3 4
0 1.51 1.61 1.94 2.13 1.95
1 1.76 1.91 2.29 2.54 2.38
2 2.02 2.22 2.64 2.96 2.81
3 2.27 2.52 2.99 3.37 3.24
4 2.53 2.83 3.35 3.79 3.67
5 2.78 3.13 3.70 4.21 4.09
6 3.04 3.44 4.05 4.63 4.53
0 1.94
1 2.29
2 2.64
3 2.99
4 3.35
5 3.70
6 4.05
Name: 2, dtype: float64
0 1.94
1 2.29
2 2.64
3 2.99
4 3.35
5 3.70
6 4.05
Name: 2, dtype: float64
0 1.94
1 2.29
2 2.64
3 2.99
4 3.35
5 3.7
Lower energy: 2 Higher energy: 4