使用for循环,我怎样才能使两个对象被迭代?

时间:2017-05-26 23:35:20

标签: python python-2.7

如果措词不正确,请原谅我。所以我正在使用一些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 +。

2 个答案:

答案 0 :(得分:1)

这是itertools grouper recipe

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