【问题标题】:How to filter from a list of dictionaries and write to a file?如何从字典列表中过滤并写入文件?
【发布时间】:2021-12-06 03:52:05
【问题描述】:

我想对我之前的问题进行一些改进: How to format the dictionary object in the list of dictionaries?

打印(标签列表)

[[{'script': [{'domain': 'random.com', 'path': 'js/custom.js'}]},
 {'script': [{'domain': 'cdnjs.cloudflare.com',
              'path': '/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.js'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/bootstrap.min.css'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/style.css'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/responsive.css'}]},
 {'link': [{'domain': 'random.com',
            'path': 'css/jquery.mCustomScrollbar.min.css'}]},
 {'link': [{'domain': 'netdna.bootstrapcdn.com',
            'path': '/font-awesome/4.0.3/css/font-awesome.css'}]}]]

我想获取'domain' 键中的所有数据,并将它们逐行存储在一个新文件domain.txt 中。

域名.txt

random.com
cdnjs.cloudfare.com
netdna.bootstrapcdn.com

应避免重复。

【问题讨论】:

  • 如果您有任何尝试,最好将其添加到问题中。其他人可以指导你哪里出错了
  • 这可能是您的其他帖子/问题的问题,但为什么该值是单项列表,而不仅仅是该列表中的dict?以及为什么整个容器是字典列表的列表。您在另一篇帖子output 中提供的解决方案是字典列表。

标签: python python-3.x list dictionary file-handling


【解决方案1】:

看起来好像不需要大量的内部列表,但如果你真的需要它们,那么这应该可以处理所有可能的情况:

taglist = [[{'script': [{'domain': 'random.com', 'path': 'js/custom.js'}]},
 {'script': [{'domain': 'cdnjs.cloudflare.com',
              'path': '/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.js'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/bootstrap.min.css'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/style.css'}]},
 {'link': [{'domain': 'random.com', 'path': 'css/responsive.css'}]},
 {'link': [{'domain': 'random.com',
            'path': 'css/jquery.mCustomScrollbar.min.css'}]},
 {'link': [{'domain': 'netdna.bootstrapcdn.com',
            'path': '/font-awesome/4.0.3/css/font-awesome.css'}]}]]
D = set()
with open('domain.txt', 'w') as dfile:
    for tag in taglist:
        for subtag in tag:
            if (d := subtag.get('script', None)) is None:
                if (d := subtag.get('link', None)) is None:
                    continue
            for e in d:
                if (domain := e.get('domain', None)):
                    D.add(domain)
    for domain in D:
        print(domain, file=dfile)

[注意:您需要 Python 3.8+ ]

【讨论】:

    【解决方案2】:

    一种方法:

    data = [[{'script': [{'domain': 'random.com', 'path': 'js/custom.js'}]},
             {'script': [{'domain': 'cdnjs.cloudflare.com',
                          'path': '/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.js'}]},
             {'link': [{'domain': 'random.com', 'path': 'css/bootstrap.min.css'}]},
             {'link': [{'domain': 'random.com', 'path': 'css/style.css'}]},
             {'link': [{'domain': 'random.com', 'path': 'css/responsive.css'}]},
             {'link': [{'domain': 'random.com',
                        'path': 'css/jquery.mCustomScrollbar.min.css'}]},
             {'link': [{'domain': 'netdna.bootstrapcdn.com',
                        'path': '/font-awesome/4.0.3/css/font-awesome.css'}]}]]
    
    # open file for writing
    with open("domain.txt", "w") as outfile:
        # create a set to check for duplicates
        seen = set()
        for top in data:
            for e in top:
    
                # get domain data either from script or link
                se = e.get("script") or e.get("link")
    
                # fetch the domain name
                domain = se[0]["domain"]
    
                # write if not previously seen
                if domain not in seen:
                    seen.add(domain)
                    outfile.write(f"{domain}\n")
    

    输出

    random.com
    cdnjs.cloudflare.com
    netdna.bootstrapcdn.com
    

    【讨论】:

    • 如果列表中有更多项,
    • 更新了答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2020-04-08
    • 2022-12-02
    • 2022-01-25
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多