如果措词不正确,请原谅我。所以我正在使用一些JSON数据,我想尝试打印一些列化输出,以便在每次传递时打印两个或三个对象。现在,这将按预期迭代一次。
data = json.loads(subprocess.check_output(["some_command_here"]))
for obj in data:
print obj['key_a']
输出
value_a
value_b
value_c
value_d
value_e
我想要达到的目标是:
value_a value_b value_c
value_d value_e
每组对象打印在一行上。所以第一次迭代处理value_a,value_b和value_c,下一个处理value_d,value_e和value_f是适用的等等。
在这种情况下,迭代如何变化?另一件事是值得考虑的是数据中的对象数量是动态的。可能是1,可能是5,可能是20 +。
答案 0 :(得分:1)
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
您的用例类似于:
from __future__ import print_function
for objs in grouper(data, 3, fillvalue=''):
print(*objs, sep=' ')
答案 1 :(得分:0)
有很多方法可以为这只猫提供皮肤,这里有一个作为生成器的程序:
def iterate_columns(iterable, columns=4):
result = []
for item in iterable:
result.append(item)
if len(result) >= columns:
yield result
result = []
if result:
yield result
your_list = ["value_a", "value_b", "value_c", "value_d", "value_e"]
for row in iterate_columns(your_list, 3):
print(row) # feel free to print your data however you want
# prints:
# ['value_a', 'value_b', 'value_c']
# ['value_d', 'value_e']
或者切片,再次作为生成器函数:
def iterate_columns(iterable, columns=4):
for i in xrange(0, len(iterable), columns): # replace with range() on Python 3.x
yield iterable[i:i+columns]
最后,可能是最快的就地使用 - 使用列表理解的相同概念:
[your_list[i:i+3] for i in xrange(0, len(your_list), 3)] # replace 3 with number of columns