为什么获取生成器对象而不是列表 [英] Why a generator object is obtained instead of a list

查看:48
本文介绍了为什么获取生成器对象而不是列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用Python 3.4,我具有以下JSON

Using Python 3.4, I have the following JSON

mylist = [
        {
          "mdata": [
                    {
                      "url" : "http://fake1001/Standard",
                      "fmt" : "Standard"
                    },                            
                    {
                      "url" : "http://fake1001/Thumb",
                      "fmt" : "Thumb"
                    }                                      
                    ]
        },
        {
          "mdata": [
                    {
                      "url" : "http://fake1002/Standard",
                      "fmt" : "Standard"
                    },                            
                    {
                      "url" : "http://fake1002/Large",
                      "fmt" : "Large"
                    }                                      
                    ]
        },
        {
          "mdata": [
                    {
                      "url" : "http://fake1003/Thumb",
                      "fmt" : "Thumb"
                    },                            
                    {
                      "url" : "http://fake1003/Large",
                      "fmt" : "Large"
                    }                                      
                    ]
        }          
      ]

我想将所有具有标准"格式的项目的网址放入列表中:

I want to put all urls of items with a "Standard" format into a list:

urls = []

for m in mylist:
  for md in m["mdata"]:
    if md["fmt"] == "Standard":
      urls.append(md["url"])

print(urls)

我得到以下结果:

['http://fake1001/Standard', 'http://fake1002/Standard']

现在,我尝试使用列表理解来完成相同的任务:

Now, I tried using list comprehension to do the same task:

urls2 = []
urls2.append(md["url"] for m in mylist for md in m["mdata"] if md["fmt"] == "Standard")

print(urls2)

但是,我却得到了一个生成器对象:

However, I get a generator object instead:

[<generator object <genexpr> at 0x000000000860F510>]

要获取网址,我可以在生成器对象上调用next():

To get the urls, I can call next() on the generator object:

print(next(urls2[0]))
print(next(urls2[0]))

哪个给我这个:

http://fake1001/Standard
http://fake1002/Standard

我想知道的是为什么列表理解会产生一个生成器对象,以及是否有任何方法可以避免这种情况?

What I want to know is why the list comprehension gives a generator object, and if there is any way to avoid that?

推荐答案

generator的语法表达式是:

(i for i in range(10))

对于带可迭代功能的函数,您可以选择不使用大括号:

You can optionally leave the braces off for functions that take iterables:

sum(i for i in range(10))

您可能已经习惯了更常见的列表理解:

You're probably used to the more common list comprehension:

[i for i in range(10)]

要从生成器中获取列表,只需使用list()将其完善即可.就您而言:

To get a list from a generator simply exahust it with list(). In your case:

urls2.append(list(md["url"] for m in mylist for md in m["mdata"] if md["fmt"] == "Standard"))

或改为使用列表理解:

urls2.append([md["url"] for m in mylist for md in m["mdata"] if md["fmt"] == "Standard"])

这篇关于为什么获取生成器对象而不是列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆