在Pandas中处理之前,将字典值中的列表列表展平

2024-09-28 01:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:

如果我需要展开一个列表列表,我会使用类似于列表理解的方法将其展平到单个列表中:

[item for sublist in l for item in sublist]

我有一个字典,其中一些值是列表列表,在导入到Pandas之前,我需要将这些值展平到单个列表中。在

^{pr2}$

所需的数据结构:

defaultdict(list,
            {'object network fake-1': [' host 10.0.0.1'],
             'object network fake12': [' host 10.0.0.12'],
             'object network fake2': [' host 10.0.0.2 '],
             'object network fake3': [' host 10.0.0.0 255.255.255.0'],
             'object network fake4': [' host 10.0.0.4'],
             'object network fake5': [' host 10.0.0.5'],
             'object-group network prt-apps': [' network-object object fake-1',
              ' network-object object fake2',
              ' network-object object fake3',
              ' network-object object fake121'],
             'object-group network prt-apps2': [' network-object object fake4',
              ' group-object prt-apps',
               ' network-object object fake-1',
               ' network-object object fake2',
               ' network-object object fake3',
               ' network-object object fake121'],
             'object-group network prt-apps3': [' network-object object fake5',
              ' group-object prt-apps2',
               ' network-object object fake4',
               ' group-object prt-apps',
                ' network-object object fake-1',
                ' network-object object fake2',
                ' network-object object fake3',
                ' network-object object fake121']})

我已经为此搜索过了,但没有看到可以使用的示例。有没有一种简单的方法可以在字典值内展平这些“列表”容器?在

这是我在熊猫身上消费时处理其他字典结构的方法,但上面的第一个字典不适用:

pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in asa.iteritems() ]))

Tags: apps方法inhost列表for字典object
2条回答

以下是我理解的工作(对于您的特定示例,这依赖于list +行为):

def unpack(l):
    j = []
    for i in l:
        if type(i) != list:
            j.append(i)
        else:
            j = j + unpack(i)
    return j

j = {}
for k, v in l.items():
    j[k] = unpack(v)

在您的示例中,从dict开始:

^{pr2}$

你的结局是

j = {'object network fake12': [' host 10.0.0.12'],
     'object-group network prt-apps': [' network-object object fake-1',
                                       ' network-object object fake2',
                                       ' network-object object fake3',
                                       ' network-object object fake121'],
     'object network fake-1': [' host 10.0.0.1'],
     'object network fake2': [' host 10.0.0.2 '],
     'object network fake3': [' host 10.0.0.0 255.255.255.0'],
     'object-group network prt-apps2': [' network-object object fake4',
                                        ' group-object prt-apps',
                                        ' network-object object fake-1',
                                        ' network-object object fake2',
                                        ' network-object object fake3',
                                        ' network-object object fake121'],
     'object-group network prt-apps3': [' network-object object fake5',
                                        ' group-object prt-apps2',
                                        ' network-object object fake4',
                                        ' group-object prt-apps',
                                        ' network-object object fake-1',
                                        ' network-object object fake2',
                                        ' network-object object fake3',
                                        ' network-object object fake121'],
     'object network fake4': [' host 10.0.0.4'],
     'object network fake5': [' host 10.0.0.5']}

作为原帖子的后续报道。我设法解决了这个问题,并在以下生成器函数的帮助下将字典中的列表展平:

取自here

def flatten(l):
    for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
            for sub in flatten(el):
                yield sub
        else:
            yield el

在字典中使用它,如下所示:

^{pr2}$

请注意,Python3的这个函数还有另一个版本,可以通过上面的链接找到。在

相关问题 更多 >

    热门问题