【问题标题】:Removing Outermost List删除最外层列表
【发布时间】:2017-10-10 22:58:23
【问题描述】:

假设我有一个处理输入并在列表中返回 JSON 数据的函数,例如:

def findme (name):

    data = ''
    address = 'http://someaddresswithname&format=json'
    response = urllib.request.urlopen (address)
    content = response.read ()

    if content:
        data = json.loads (content.decode ('utf-8'))

    return data


if __name__ == '__main__':

    listfound = []
    names = ['bob', 'alice']

    listfound = map (findme, name)

返回的数据包含:

[{'A': 1, 'B': 2'}], [{'A': 5, 'B': 9}]

因为我使用的是地图,所以它会创建另一个包含相同数据的列表。 Listfound 现在是

[[{'A': 1, 'B': 2'}], [{'A': 5, 'B': 9}]]

外部列表只有 1 个元素,不需要在列表中。我可以遍历它并创建另一个列表,但这会降低使用“地图”的效率。如何让 map 像这样返回正常列表?

[{'A': 1, 'B': 2}, {'A': 5, 'B': 9}]

更新 1 - 将名称更新为 2 个元素而不是 1 个 - 最初的名称 = ['bob']。还修复了返回以匹配其他名称元素的实际列表。

我尝试过一种方法,但它涉及嵌套循环。还有更好的选择吗?

>>> results = [[{'A': 1, 'B': 2}], [{'A': 5, 'B': 9}]]
>>> newresult = [item for sublist in results for item in sublist]
>>> newresult
[{'B': 2, 'A': 1}, {'B': 9, 'A': 5}]

【问题讨论】:

  • listfound = listfound[0]listfound, = listfound
  • 如此明显。我把事情复杂化了。谢谢。
  • 但是你为什么还要使用地图呢?就做listfound = findme('bob')
  • 因为它是一个列表。 name = ['bob', 'alice', ...]
  • 但是如果您只取结果列表中的第一项,这意味着您只处理name 中的第一项,因此可以直接调用findme

标签: json list dictionary python-3.5


【解决方案1】:

JSON 数据返回一个列表,map 也将其放入另一个列表中,我将不得不对数据进行处理以获得我想要的输出。

似乎列表理解是最好的方法。

>>> import timeit
>>> from itertools import chain

>>> def listcomp ():

    sample = [[{'B': 2, 'A': 1}], [{'B': 9, 'A': 5}]]
    results = [item for sublist in sample for item in sublist]

    return results

>>> 

>>> def iterchain ():

    sample = [[{'B': 2, 'A': 1}], [{'B': 9, 'A': 5}]]
    results = list (chain.from_iterable (sample))

    return results

>>> 

>>> timeit.timeit (listcomp, number = 5000000)
7.123541992972605

>>> timeit.timeit (iterchain, number = 5000000)
8.06846271501854

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多