Python. How to iterate through a list of lists looking for a partial match
- by Becca Millard
I'm completely stuck on this, without even an idea about how to wrap my head around the logic of this.
In the first half of the code, I have successfully generation a list of (thousands of) lists of players names and efficiency scores: eg name_order_list = [["Bob", "Farley", 12.345], ["Jack", "Donalds", 14.567], ["Jack", "Donalds", 13.421], ["Jack", "Donalds", 15.232],["Mike", "Patricks", 10.543]]
What I'm trying to do, is come up with a way to make a list of lists of the average efficiency of each player. So in that example, Jack Donalds appears multiple times, so I'd want to recognize his name somehow and average out the efficiency scores. Then sort that new list by efficiency, rather than name.
So then the outcome would be like: average_eff_list = [[12.345, "Bob", "Farley"], [14.407, "Jack", "Donalds"], [10.543, "Mike", "Patricks"]]
Here's what I tried (it's kind of a mess, but should be readable):
total_list = []
odd_lines = [name_order_list[i] for i in range(len(name_order_list)) if i % 2 == 0]
even_lines = [name_order_list[i] for i in range(len(name_order_list)) if i % 2 == 1]
i = 0
j = i-1
while i <= 10650:
iteration = 2
total_eff = 0
while odd_lines[i][0:2] == even_lines[i][0:2]:
if odd_lines[i][0:2] == even_lines[j][0:2]:
if odd_lines[j][0:2] != even_lines[j][0:2]:
total_eff = even_lines[j][2]/(iteration-1)
iteration -= 1 #account fr the single (rather than dual) additional entry
else:
total_eff = total_eff
if iteration == 2:
total_eff = (odd_lines[i][2] + even_lines[i][2]) / iteration
else:
total_eff = ((total_eff * (iteration - 2)) + (odd_lines[i][2] + even_lines[i][2])) / iteration
iteration += 2
i += 1
j += 1
if i > 10650:
break
else:
if odd_lines[i][0:2] == even_lines[j][0:2]:
if odd_lines[j][0:2] != even_lines[j][0:2]:
total_eff = (odd_lines[i][2] + even_lines[j][2]) / iteration
else:
total_eff = ((total_eff * (iteration -2)) + odd_lines[i][2]) / (iteration - 1)
if total_eff == 0: #there's no match at all
total_odd = [odd_lines[i][2], odd_lines[i][0], odd_lines[i][1]]
total_list.append(total_odd)
if even_lines[i][0:2] != odd_lines[i+1][0:2]:
total_even = [even_lines[i][2], even_lines[i][0], even_lines[i][1]]
else:
total = [total_eff, odd_lines[i][0], odd_lines[i][1]]
total_list.append(total)
i += 1
if i > 10650:
break
else:
print(total_list)
Now, this runs well enough (doesn't get stuck or print someone's name multiple times) but the efficiency values are off by a large amount, so I know that scores are getting missed somewhere.
This is a problem with my logic, I think, so any help would be greatly appreciated. As would any advice about how to loop through that massive list in a smarter way, since I'm sure there is one...
EIDT: for this exercise, I need to keep it all in a list format. I can make new lists, but no using dictionaries, classes, etc.