Python Forum
update values in list based on dictionary
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
update values in list based on dictionary
#1
Im quite new to python and struggling on this. Any help would be much appreciated please

I have a dictionary as follows:

teams -> {'42': 'arsenal', '48': 'chelsea', '43': 'Liverpool', '49': 'Man City', '24': 'Wolves'}

I have a a file of rows which one i split into a list looks like below:

['Hex', 'Team', 'League', 'Won League']
['0xDEFK', 'arsenal', 'EPL', 'Yes']
['0x1E56', 'chelsea', 'EPL', 'Yes']
['0xFDC0', 'liverpool', 'EPL', 'No']
['0x76YJ', 'Man City', 'EPL', 'Yes']
['0xAB7J', 'Wolves', 'EPL', 'No']



I want to be able to loop through above rows and update the second column "Team" with the number of that team from the "teams" dictionary

ie

EXAMPLE 1:
['0xDEFK', 'arsenal', 'EPL', 'Yes']

WOULD BECOME 42 because key for arsenal is 42:

['0xDEFK', '42', 'EPL', 'Yes']


EXAMPLE 2:
['0x1E56', 'chelsea', 'EPL', 'Yes']

WOULD BECOME 48 because key for chelsea is 48:

['0x1E56', '48', 'EPL', 'Yes']


I've something like below but not having much luck, what am i doing wrong? Is there a easier way to do this? Thanks in advance:

with open('info_output.txt', 'r') as info_outputfile:

    for line in info_outputfile:
        l = line.split('|') 
        #info = [Hex, Team, League, WonLeague]

        newlist = []
        for element in info:
            newlist.append ((element[0], dictionary [element[1]], element[4], element[3]))
            print newlist
The error i get when i run this script is:

Error:
Traceback (most recent call last): element[1] = dictionary[ element[1]] KeyError: '0'
Reply
#2
I suggest the following improvements
  1. The dictionary has the scores as keys and the teams as values, they want switching so the teams are the keys and the scores are the values.
  2. The first line from the text file you want to skip over it as its a header, to do this you can use next on info_outputfile
  3. 'liverpool' in the file is lower case l, 'Liverpool' in the dictionary has upper case L, one or the other must change so they match.
  4. There is one too many loops, remove the last one
  5. Change the line split variable from l to element
  6. The list indexes are wrong for the last two items from the split.
  7. The error shown does not match the code shown.
Reply
#3
Quote:I have a dictionary as follows:
teams = {'42': 'arsenal', '48': 'chelsea', '43': 'Liverpool', '49': 'Man City', '24': 'Wolves'}
I have a a file of rows which one i split into a list looks like below:

['Hex', 'Team', 'League', 'Won League']
['0xDEFK', 'arsenal', 'EPL', 'Yes']
['0x1E56', 'chelsea', 'EPL', 'Yes']
['0xFDC0', 'liverpool', 'EPL', 'No']
['0x76YJ', 'Man City', 'EPL', 'Yes']
['0xAB7J', 'Wolves', 'EPL', 'No']
I want to be able to loop through above rows and update the second column "Team" with the number of that team from the "teams" dictionary

So you iterate over the text file, line by line and split the fields.
You want to lookup the second field "Team" in the values of a dictionary.
This is the problem. Exchange the keys with values in your dictionary
and then the lookup is much easier:

>>> teams = {'42': 'arsenal', '48': 'chelsea', '43': 'Liverpool', '49': 'Man City', '24': 'Wolves'}
>>> teams
{'42': 'arsenal', '48': 'chelsea', '43': 'Liverpool', '49': 'Man City', '24': 'Wolves'}
>>> {v:k for k,v in teams.items()}
{'arsenal': '42', 'chelsea': '48', 'Liverpool': '43', 'Man City': '49', 'Wolves': '24'}
>>> teams = {v:k for k,v in teams.items()}
>>> teams
{'arsenal': '42', 'chelsea': '48', 'Liverpool': '43', 'Man City': '49', 'Wolves': '24'}
>>> teams['arsenal']
'42'
>>> teams[' arsenal ']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: ' arsenal '
>>> teams.get(' arsenal ', 'Team not found')
'Team not found'
>>> teams.get('arsenal', 'Team not found')
'42'
>>> 
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
Reply
#4
Another possibility is to be creative with indexing without need to convert dictionary.

'Get index of needed value in list of dictionary values and find key with same index in list of dictionary keys':

>>> d = {1: 'ham', 2: 'eggs', 3: 'bacon'}
>>> value = 'eggs'
>>> [*d.keys()][[*d.values()].index(value)]    # instead of *d.keys() one may use *d
2
This way it is possible to have non-hashable values but still find corresponding key:

>>> d = {1: ['ham'], 2: ['eggs'], 3: ['bacon']}                             
>>> value = ['bacon']                                                       
>>> [*d.keys()][[*d.values()].index(value)]                         
3
NB! If there are several equal values this will return first one encountered.

Follow-up edit: so one can utilize this something like following:

>>> dct = {'1': 'one', '2': 'two', '3': 'three'}
>>> lst = [
...       ['one', 'uno'],
...       ['two', 'dos'],
...       ['three', 'tres']
... ]
>>> for row in lst:
...     row[0] = [*dct][[*dct.values()].index(row[0])]
...
>>> lst
[['1', 'uno'], ['2', 'dos'], ['3', 'tres']]
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  unable to remove all elements from list based on a condition sg_python 3 377 Jan-27-2024, 04:03 PM
Last Post: deanhystad
  Dictionary in a list bashage 2 495 Dec-27-2023, 04:04 PM
Last Post: deanhystad
  filtering a list of dictionary as per given criteria jss 5 597 Dec-23-2023, 08:47 AM
Last Post: Gribouillis
  need to compare 2 values in a nested dictionary jss 2 798 Nov-30-2023, 03:17 PM
Last Post: Pedroski55
  Copying the order of another list with identical values gohanhango 7 1,062 Nov-29-2023, 09:17 PM
Last Post: Pedroski55
  Search Excel File with a list of values huzzug 4 1,147 Nov-03-2023, 05:35 PM
Last Post: huzzug
  Sort a list of dictionaries by the only dictionary key Calab 1 452 Oct-27-2023, 03:03 PM
Last Post: buran
  Comparing List values to get indexes Edward_ 7 1,083 Jun-09-2023, 04:57 PM
Last Post: deanhystad
  Printing specific values out from a dictionary mcoliver88 6 1,317 Apr-12-2023, 08:10 PM
Last Post: deanhystad
  How to add list to dictionary? Kull_Khan 3 951 Apr-04-2023, 08:35 AM
Last Post: ClaytonMorrison

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020