首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迭代Python数据结构

迭代Python数据结构
EN

Stack Overflow用户
提问于 2014-03-19 22:40:19
回答 3查看 2.7K关注 0票数 0

我在处理Python数据结构时遇到了问题:

代码语言:javascript
运行
复制
 data = {'nmap': {'command_line': u'ls',
                  'scaninfo': {u'tcp': {'method': u'connect',
                                        'services': u'80,443'}},
                  'scanstats': {'downhosts': u'0',
                                'elapsed': u'1.18',
                                'timestr': u'Wed Mar 19 21:37:54 2014',
                                'totalhosts': u'1',
                                'uphosts': u'1'}},
         'scan': {u'url': {'addresses': {u'ipv6': u'2001:470:0:63::2'},
                                        'hostname': u'abc.net',
                                        'status': {'reason': u'syn-ack',
                                                   'state': u'up'},
                                        u'tcp': {80: {'conf': u'3',
                                                      'cpe': '',
                                                      'extrainfo': '',
                                                      'name': u'http',
                                                      'product': '',
                                                      'reason': u'syn-ack',
                                                      'state': u'open',
                                                      'version': ''},
                                                 443: {'conf': u'3',
                                                       'cpe': '',
                                                       'extrainfo': '',
                                                       'name': u'https',
                                                       'product': '',
                                                       'reason': u'syn-ack',
                                                       'script': {
                                                           u'ssl-cert': u'place holder'},
                                                       'state': u'open',
                                                       'version': ''}},
                                        'vendor': {}
         }
         }
 }

基本上,我需要迭代“tcp”键值,如果“脚本”项存在,则提取它的内容。

这就是我尝试过的:

代码语言:javascript
运行
复制
items = data["scan"]
for item in items['url']['tcp']:
    if t["script"] is not None:
        print t  

然而,我似乎无法使它发挥作用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-19 22:52:31

这将在数据结构中的任何位置找到任何具有键'script'的字典项:

代码语言:javascript
运行
复制
def find_key(data, search_key, out=None):
    """Find all values from a nested dictionary for a given key."""
    if out is None:
        out = []
    if isinstance(data, dict):
        if search_key in data:
            out.append(data[search_key])
        for key in data:
            find_key(data[key], search_key, out)
    return out

关于你的数据,我得到:

代码语言:javascript
运行
复制
>>> find_key(data, 'script')
[{'ssl-cert': 'place holder'}]

若要查找端口,请稍加修改:

代码语言:javascript
运行
复制
tcp_dicts = find_key(data, 'tcp') # find all values for key 'tcp'
ports = [] # list to hold ports
for d in tcp_dicts: # iterate through values for key 'tcp'
    if all(isinstance(port, int) for port in d): # ensure all are port numbers
        for port in d:
            ports.append((port, 
                          d[port].get('script'))) # extract number and script

现在你得到了这样的东西:

代码语言:javascript
运行
复制
[(80, None), (443, {'ssl-cert': 'place holder'})]
票数 1
EN

Stack Overflow用户

发布于 2014-03-19 22:45:37

data['scan']['url']['tcp']是一个字典,所以当您只是迭代它时,您将得到键,而不是值。如果要迭代这些值,则必须这样做:

代码语言:javascript
运行
复制
for t in data['scan']['url']['tcp'].values():
    if 'script' in t and t['script'] is not None:
        print(t)

如果您也需要密钥,请迭代这些项:

代码语言:javascript
运行
复制
for k, t in data['scan']['url']['tcp'].items():
    if 'script' in t and t['script'] is not None:
        print(k, t)

您还需要更改测试以首先检查'script' in t,否则访问t['script']将引发关键错误。

票数 1
EN

Stack Overflow用户

发布于 2014-03-19 22:44:03

你不是说if item["script"]

实际上,如果密钥有机会不存在,请使用dict提供的dict方法。

所以试一试

代码语言:javascript
运行
复制
items = data["scan"]
for item in items['url']['tcp']:
    script = item.get('script')
    if script:
        print script
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22519674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档