SirSeba
SirSeba

Reputation: 151

Compare dictionary with a variable

I am trying to compare a dictionary value with a variable but for some reasons I can't output the part that I want from the dictionary. The dictionary is an ouput from a html table. This is the code that I use to prase the html table into a dictionary:

with open('output.csv') as fd:
    rd = csv.DictReader(fd, skipinitialspace=True)
    for row in rd:
        lista = { k: row[k] for k in row if k in ['Name', 'Clan Days']}

This is the output:

{'Name': 'SirFulgeruL2k19', 'Clan Days': '140'}
{'Name': 'Darius', 'Clan Days': '127'}

How to I compare for example the clan days from the first dictionary and if the value matches the value that I set in a variable should get the name as a string so I can later use it in another line.

Upvotes: 2

Views: 200

Answers (2)

iScripters
iScripters

Reputation: 421

Not really sure what exactly you want, but if it's just comparing a dictionary value to a variable and getting the Name part if they match, you would get something like this..

>>> dict = {'Name': 'SirFulgeruL2k19', 'Clan Days': '140'}
>>> target = 140
>>> if int(dict['Clan Days']) == target:
...    name = dict['Name']
...    
>>> name
'SirFulgeruL2k19'

Edit: Read your post too quickly, considering it's all the rows from a HTML table this code is too simple. Use alecxe's answer :)

Upvotes: 0

alecxe
alecxe

Reputation: 473983

Assuming you first read the data into a list of dictionaries:

data = [{ k: row[k] for k in row if k in ['Name', 'Clan Days']}
        for row in rd]

You may use next() to search for the first dictionary in data matching the Clan Days value defaulting to None if no entries matched your search query:

desired_clan_days = '140'
clan_name = next((entry["Name"] for entry in data 
                  if entry["Clan Days"] == desired_clan_days), None)

Now, next() would return you the first match, if you need all of the matches, just use a list comprehension:

clan_names = [entry["Name"] for entry in data 
              if entry["Clan Days"] == desired_clan_days]

Note that this kind of search requires you to, in the worst case (entry not found), loop through all the entries in data. If this kind of search is the primary use case of this data structure, consider re-designing it to better fit the problem - e.g. having clan_days value as a key with a list of clan names:

data = { 
    "140": ["SirFulgeruL2k19"],
    "127": ["Darius"]
}

In that state, getting a match would be a constant operation and as easy as data[desired_clan_days]. defaultdict(list) is something that would help you to make that transformation.

Upvotes: 2

Related Questions