灵活性:索引变量与常量

时间:2013-01-05 00:58:17

标签: python

考虑以下假设情况。

作为您在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列表中。您通常会使用索引变量而不是常量(期望为将进入列表的后续项增加常量),如果是,您会使用本地或全局索引吗?您如何在代码中考虑这种灵活性?

2 个答案:

答案 0 :(得分: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')]

马蒂诺已经在我没有阅读的评论中回答了这个问题,所以应该归功于信用。抱歉。

答案 1 :(得分: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')]