我有一个简单的python dict为什么打印生成器引用而不是dict

时间:2013-05-14 22:32:49

标签: python generator

创建一个简单的字典:

 procinfos = {"f1": f1, "f2": f2, "f3shell" : (wrap_for_process, q, f3shell, "input arg1", "input arg2")}

然后我要打印其内容:

 print (procinfo for procinfo in procinfos)

<generator object <genexpr> at 0x7f46dccc0dc0>

为什么python只告诉我这是一台发电机?我怎样才能简单地打印内容。从我读到的关于生成器的内容来看,它们不打算使用dict / list。但这已经是一个完全具体化的系列 - 对我来说没有任何意义(至少对我来说......)而不是简单地打印它。这是一个常见的用例,非常希望能够获得这些集合的基本打印方式。感谢。

更新:我想要一行/内联,而不是多行。感谢。

4 个答案:

答案 0 :(得分:5)

您正在打印一台发电机。

procinfo for procinfo in procinfos

是生成器表达式。它只会在迭代时进行评估。您可以这样做,例如将其传递给列表构造函数:

list(procinfo for procinfo in procinfos)

但是你可以得到相同的结果(注1):

list(procinfos.keys())

或者在Python 2中:

procinfos.keys()

所以很有可能,做你想做的事情:

print procinfos.keys()

如果你想在每一行打印一个,你可以这样做:

print '\n'.join(procinfos)

注1:实际上只有list(procinfos)才能正常工作,就像'\ n'.join(procinfos)一样,但为什么它会起作用不太明显,但这是因为迭代了字典将迭代它的键。这是一个更高级的Python,所以现在不要担心它。 : - )

答案 1 :(得分:2)

因为您将生成器表达式传递给printprint尝试将非字符串参数转换为字符串,但生成器没有一个很好的,人类可读的 str repr 定义,因为它们是直到它们被使用(通过迭代器)才进行评估,因此得到<generator object...>结果。你需要:

for procinfo in procinfos:
    print(procinfo)

对于内联解决方案,它取决于您正在寻找的格式,但我会选择以下内容:

print('\n'.join(procinfos))

当然,这个(以及您的原始代码)仅打印来自procinfos的密钥。如果你想要key:value对,你可以这样做:

print('\n'.join('{}: {}'.format(k, v) for k, v in procinfos.items()))

我假设你想要新行或其他格式,当然,因为如果你只想在一行打印整个字典,print procinfos就是你所需要的。

答案 2 :(得分:2)

只需使用括号:

print [procinfo for procinfo in procinfos]

答案 3 :(得分:0)

正如其他答案所说,如果你明确地给print一个生成器表达式,它将打印一个生成器。

如果您希望它打印列表,您必须(a)从中列出一个列表,或者(b)首先将列表传递给它(例如,通过使用列表推导而不是生成器表达式):

print list(procinfo for procinfo in procinfos)
print [procinfo for procinfo in procinfos]

正如Lennart Regebro指出的那样,如果你只想打印字典的键,你甚至不需要genexp或listcomp,因为keys方法返回一个列表(在Python 2中)或者您可以传递给list的迭代器(在Python 3中):

print procinfos.keys()

或者,就此而言(2.x和3.x):

print list(procinfos)

如果你想“打印dict的内容”,可能意味着键和值......只需打印字典:

print procinfos

然而,解决这个问题的最好方法是不要依赖print做任何魔术,并希望__str__使用一些足够好的格式。相反,决定希望如何将输出转换为字符串,然后执行此操作。例如:

print ' '.join(procinfo for procinfo in procinfos)

但当然以上所有要点仍然适用于此:

print ' '.join(procinfo)
print ' '.join(procinfo.items())
# ...