【问题标题】:Obtaining Values from a List-Dictionary Hybrid List Dynamically从列表-字典混合列表中动态获取值
【发布时间】:2016-01-20 00:56:38
【问题描述】:

我目前正在尝试获取从 MongoDB 查询接收到的 JSON 文档的某些字段的值。该查询返回一个字典,通过在查询中使用.values(),我得到了一个值列表。但是,此列表的某些值是另一个包含字典的列表。我正在尝试找出动态获取列表中已有值的值以及在子列表中找到的字典值的最佳方法。

例如,我有一个名为text_list的列表:

>>> text_list 
[[{u'field1': u'field1_value1', u'field2': u'field2_value1'},
  {u'field2': u'field2_value2'}],
 u'value1',
 u'value2']

我只想从这个列表中获取值:field1_value1, field2_value1, field2_value2, value1, value2(或者将它们放在一个新列表中,或者只是将这些值连接成一个大字符串)。

我想为多个列表执行此过程,但有时这些列表有这些额外的字典,而其他时候则没有。 什么是获取我正在寻找的值的最佳(最少计算密集/最快)方法

我想出了以下方法:

def concatenate_list(inList):
    outString = '' #empty string that the values will be added to
    for item in inList:
        if type(item) == list:
            for i in np.arange(len(item)):
                for subitem in item[i].values():
                    outString = outString+' '+subitem
        else:
            outString = outString+' '+item
    return outString

>>> concatenate_list(text_list)
u'field1_value1 field2_value1 field2_value2 value1 value2'

这给了我想要的结果,但必须有比这更好的方法。当我必须在数千个列表上运行此函数时,我认为这不是很有效。

【问题讨论】:

    标签: python list python-2.7 dictionary


    【解决方案1】:

    您可以编写一个递归函数,它可以打印值,前提是它们既不是列表也不是字典,就像这样

    >>> def rec_fetcher(obj):
    ...     if isinstance(obj, list):
    ...         for item in obj:
    ...             yield from rec_fetcher(item)
    ...     elif isinstance(obj, dict):
    ...         for item in obj:
    ...             yield from rec_fetcher(obj[item])
    ...     else:
    ...         yield obj
    ... 
    >>> list(rec_fetcher(data))
    ['field1_value1', 'field2_value1', 'field2_value2', 'value1', 'value2']
    

    注意:字典是无序的。因此,字典中的值可能与传递的字面值不同。


    yield from 是 Python 3.x 的东西。如果您使用的是 Python 2.7,则可以简单地迭代递归调用并生成数据,如下所示

    >>> def rec_fetcher(obj):
    ...     if isinstance(obj, list):
    ...         for item in obj:
    ...             for value in rec_fetcher(item):
    ...                 yield value
    ...     elif isinstance(obj, dict):
    ...         for item in obj:
    ...             for value in rec_fetcher(obj[item]):
    ...                 yield value
    ...     else:
    ...         yield obj
    ... 
    >>> list(rec_fetcher(data))
    [u'field2_value1', u'field1_value1', u'field2_value2', u'value1', u'value2']
    

    【讨论】:

    • 谢谢!我会试一试。是的,我使用的是 Python 2.7,我应该使用那个标签,我的错!
    • @Iggy 不客气 :-) 如果对您有帮助,请考虑 accepting this answer :-)
    • 抱歉,效果很好!非常感谢!
    猜你喜欢
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多