Issue
This Content is from Stack Overflow. Question asked by Anasse Gs
Good[ Morning : Evening ]
Im trying to make a small programme that :
-reads a text file containing numbers -assigned each line into an element of int_list
-takes a given list (max_quantity) and divides all the elements by 2 resulting in (max_q_in_half)
- takes (int_list) and compares each element to its counterpart in (max_q_in_half) to eliminate each element that is above 50% of its maximum value (max_quantity)
-then make all the elements that are below 50% of their maximum value
into a new list (new_list)
-then return the smallest number in the (new_list)
-then uses that number to get it’s index in the original (int_list)
-then uses that index to match the number to it’s element in (metal_list)
- to return the metal that is about to run out from the stock so the it could be restocked
HERE IS THE PROBLME
As you see in the output of this code the numbers below 50% are [41, 1]
the lowest value is 1 which has the index 6
but when i search int_list for this value it returns the firt occurence of 1 which is at index 3 which coresponds to BRASS but the correct answer should be Titanium
im triying to work around this issue by assigning a weight to each line in the text file so when i search the index of a value that value would be unique
take into account that the lines vary in number in the original text file
could somebody help me make a programe that assignes wheights of X.01 to line one and X.02 to line two …
-41.01 #Line_1
-20.02 #Line_2
-6.03 #Line_3
-1.04 #Line_4
-14.05 #Line_5
-6.06 #Line_6
-1.07 #Line_7
…
int_list = [41, 20, 6, 1, 14, 6, 1]
metal_list = ['aluminium', 'iron', 'zinc', 'brass', 'stainless steel','copper', 'titanium']
max_quantity = [ 100, 30, 6, 2, 18, 7, 15]
max_q_in_half = [x // 2 for x in max_quantity]
new_list = [i for i, j in zip(int_list, max_q_in_half) if i < j]
x = min(new_list)
v = int_list.index(x)
w = metal_list.__getitem__(v)
print("Current List ", int_list)
print("what is below 50%",new_list)
print('lowest value ',x)
print("position in int_list ",v)
print("position Metal_list ",w)
Solution
You can divide the elements of the list by 2 when checking. It is better to number it when creating a list, but with the second member, so that the number does not interfere when checking for a minimum.
int_list = [41, 20, 6, 1, 14, 6, 1]
metal_list = ['aluminium', 'iron', 'zinc', 'brass', 'stainless steel', 'copper', 'titanium']
max_quantity = [100, 30, 6, 2, 18, 7, 15]
x = min([(i, n) for n, (i, j) in enumerate(zip(int_list, max_quantity)) if i < j//2])
print(x)
w = metal_list[x[1]]
print("position Metal_list ", w)
(1, 6)
position Metal_list titanium
This Question was asked in StackOverflow by Gibbs and Answered by Сергей Кох It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.