创建一个简单的字典:
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。但这已经是一个完全具体化的系列 - 对我来说没有任何意义(至少对我来说......)而不是简单地打印它。这是一个常见的用例,非常希望能够获得这些集合的基本打印方式。感谢。
更新:我想要一行/内联,而不是多行。感谢。
答案 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)
因为您将生成器表达式传递给print
。 print
尝试将非字符串参数转换为字符串,但生成器没有一个很好的,人类可读的 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())
# ...