3

考虑以下假设情况。

作为您在 python 中开发的应用程序的一部分,您必须格式化对象列表并将每个后续项目作为元组分配给提供的关键字。这是语法:

entries = [keyword, [obj1, obj2, obj3, ...]]    # Original list of object entries

formatted = [(keyword, obj1), (keyword, obj2), (keyword, obj3), ...]

这是您建议的功能(让我知道这是否更有效):

def format(keyword, entries):
    return [(keyword, x) for x in entries[1][0]]

这是应用的功能:

foo = format(entries[0], entries[1])

灵活性问题

请注意,函数中的entries变量format具有静态索引整数10. 假设您预计新术语可能会附加到entries列表中。您通常会使用索引变量而不是常量(预计将进入列表的后续项目增加常量),如果是这样,您会使用局部索引还是全局索引?您如何在代码中考虑这种类型的灵活性?

4

2 回答 2

4

您正在向函数传递关键字和一维列表。为什么要打扰函数定义中的索引?正如我所写的那样。

e = ['spam', ['aa','bb','cc','dd']]

def format(keyword, entries):
    return [(keyword, x) for x in entries[1][0]]

format(e[0], e[1])
[('spam', 'b')]

根据对象是什么,您可能会收到索引错误。函数中不需要索引。

def format(keyword, entries):
    return [(keyword, x) for x in entries]

format(e[0], e[1])
[('spam', 'aa'), ('spam', 'bb'), ('spam', 'cc'), ('spam', 'dd')]

martineau 在我没有阅读的评论中已经回答了这个问题,因此应归功于应得的信用。对不起。

于 2013-01-05T01:16:44.613 回答
1

将评论中的各种解决方案放在一起(Satoru.Logic 和 mgilson 在这里可能比我更值得称赞):

def format(entries): # no need to split it in the caller
    # consider yield from instead of return in 3.3+
    return itertools.izip_longest([], entries[1][1][0], fill=entries[0])

foo = format(entries)

但是,我不确定您的原始代码是否正确。

当你打电话时format(entries[0], entries[1]),那就是format(keyword, [obj1, obj2, obj3, ...])。然后,在里面format,你正在迭代entries[1][0],这意味着obj2[0],忽略所有其他条目。这似乎不正确。例如,如果obj2实际上是字符串'obj2',那就是字母'o'。所以,[(keyword, x) for x in entries[1][0]]将只是[('keyword', 'o')]

于 2013-01-05T01:17:40.357 回答