【问题标题】:Python searching key returning values from list of dictsPython从字典列表中搜索键返回值
【发布时间】:2022-01-12 00:49:58
【问题描述】:

我错过了一些东西,它让我发疯,。出于某种原因,对aliases dicts 列表的查找不起作用。

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)

结果:

  • 第一个结果是正确的(“example”别名为“good”),但第二个 URL 不正确。
  • “feedburner”应别名为“notgood”
good
feedburner

试过了:

  • 方法here 使用next()get() 方法。
  • 同样的问题

【问题讨论】:

  • 我很困惑feed_source 应该是什么。我的印象是,您至少在 2 个不同的事物上使用了相同的变量名。
  • 最初,它是.netloc.split('.') 部分网址的列表(例如[feeds, feedburner, com])。然后是别名检查。如果 feed_source 应该是别名,则从具有相应 'feed_source' 的 dict 中获取 'alias',否则,保留它。

标签: python list dictionary


【解决方案1】:

您有点错过循环中的 if 位置。现在您的feed_source 列表包含与aliases 列表一样多的记录。并且它们都是平等的feed_source,除了最终有别名的那个,但无论如何你还是第一个。

正确的代码应该是:

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

所以aliased 现在最多有一个元素。如果是,它是别名,如果不是(所以aliased 为空)你只需返回feed_source

还有一个提示 - 如果你的 aliases 元素总是有两个键,也许你可以只使用 dict:

aliases = {'example': 'good', 'feedburner': 'notgood'}

【讨论】:

  • 感谢您关注代码。我是列表理解的新手。我喜欢您将变量重命名为aliased 的想法。我不太明白为什么将else feed_source 作为return 的一部分而不是原始列表组合。但它的工作!我会学习的。
  • 因为在feed_source 没有alias 的地方,aliased 列表将为空,您可能不想在此处返回 emtpy 列表。
  • 我的意思是,这取决于。您可以随时添加到 aliases 记录,例如 {"feed_source": "without_alias", "alias": "without_alias"}
  • 不管怎样,想想我最后编辑的提示 - 它会让你的代码变得更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 2015-07-17
  • 2021-05-31
  • 2013-04-14
  • 1970-01-01
  • 2012-01-29
相关资源
最近更新 更多