Pythonic处理字符串格式化循环的方法

时间:2013-08-08 21:17:46

标签: python python-3.3

我有以下代码,我们的想法是能够为root中的每个字符串迭代some_list[j]。目标是远离嵌套for循环并学习更多pythonic方法。我想为value中的第一项返回some_list,然后重复some_list中的下一项。

for i, value in enumerate(root.iter('{0}'.format(some_list[j])))
        return value

有什么想法吗?

编辑:root是

tree = ElementTree.parse(self._file)
root = tree.getroot()

3 个答案:

答案 0 :(得分:1)

认为你要做的是:

values = ('{0}'.format(root.iter(item)) for item in some_list)
for i, value in enumerate(values):
    # ...

但实际上,'{0}'.format(foo)是愚蠢的;它只会与str(foo)做同样的事情,但更慢,更难理解。很可能你已经有了字符串,所以你真正需要的是:

values = (root.iter(item) for item in some_list)
for i, value in enumerate(values):
    # ...

您可以将这些合并为一行,或将genexpr替换为map(root.iter, some_list)等,但这是基本想法。


无论如何,这里没有嵌套循环。有两个循环,但它们只是交错 - 您仍然只为some_list中的每个项目运行一次内部代码。

答案 1 :(得分:0)

那么,如果列表A包含多个列表,您想要返回每个列表的第一个元素吗?我可能没有正确地理解你,但如果是这样,你可以使用列表理解...非常" Pythonic" ;)

    In [1]: some_list = [[1,2,3],[4,5,6],[7,8,9]]

    In [2]: new = [x[0] for x in some_list]

    In [3]: new
    Out[3]: [1, 4, 7]

答案 2 :(得分:0)

您可以尝试使用chain()  来自itertools模块。它看起来像

from itertools import chain

all_items = chain(*[root.iter('{0}'.format(x) for x in some_list)])
for i, value in enumerate(all_items):
    return value # or yield i, value, or whatever you need to do with value