Home > Mobile >  Python searching key returning values from list of dicts
Python searching key returning values from list of dicts

Time:01-12

I'm missing something and its driving me bananas,. For some reason, the lookup to the aliases list of dicts is not working.

import urllib.parse


def parse_source_from_url(url):
    # Clean up the url
    parse_url = urllib.parse.urlparse(url.strip().replace('\n', ''))
    
    # Parse the interesting parts
    url = parse_url.netloc.split('.')
    
    # Words to omit
    keywords = ['feeds', 'com']
    
    # Determine which url words are not keywords to omit
    feed_source = [u for u in url if u not in keywords][0]
    
    # Map out aliases as needed
    aliases = [
        {'feed_source': 'example', 'alias': 'good'},
        {'feed_source': 'feedburner', 'alias': 'notgood'}]
    
    # Select alias if feed_source is shown in list of dict
    # This is where the problem is
    feed_source = [
        a['alias']
        if a['feed_source'] == feed_source
        else feed_source
        for a in aliases]
    
    # Return only the aliased name
    return feed_source[0]

urls = ['https://feeds.example.com/', 'https://feeds.feedburner.com/']

for u in urls:
    test = parse_source_from_url(u)
    print(test)

Results:

  • The first result is correct ("example" aliased "good") but the second URL is incorrect.
  • "feedburner" should be aliased as "notgood"
good
feedburner

Tried:

  • The method here using next() and the get() methods.
  • Same issue

CodePudding user response:

You kinda miss the if placement in your loop. Now your feed_source list contains as much records as aliases list. And all of them are equal feed_source except eventually the one that has alias, but you takes first of it anyway.

Correct code should be:

    aliased = [a["alias"] for a in aliases if a["feed_source"] == feed_source]
    return aliased[0] if aliased else feed_source

So aliased has maximum one element now. If it, it's alias, if not (so aliased is empty) you just return feed_source

And one hint - if your aliases element always have two keys, maybe you could just use dict:

aliases = {'example': 'good', 'feedburner': 'notgood'}
  •  Tags:  
  • Related