考虑以下假设情况。
作为您在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
变量具有静态索引整数1
和0
。假设您预计新术语可能会附加到entries
列表中。您通常会使用索引变量而不是常量(期望为将进入列表的后续项增加常量),如果是,您会使用本地或全局索引吗?您如何在代码中考虑这种灵活性?
答案 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')]
。