Python 灵活性问题:索引变量与常量

Python 灵活性问题:索引变量与常量,python,Python,考虑以下假设情况 作为用python开发的应用程序的一部分,必须格式化对象列表,并将每个后续项作为元组分配给提供的关键字。以下是语法: entries = [keyword, [obj1, obj2, obj3, ...]] # Original list of object entries formatted = [(keyword, obj1), (keyword, obj2), (keyword, obj3), ...] 以下是您建议的功能(请让我知道这是否更有效): 以下是应用

考虑以下假设情况

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

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

formatted = [(keyword, obj1), (keyword, obj2), (keyword, obj3), ...]
以下是您建议的功能(请让我知道这是否更有效):

以下是应用的函数:

foo = format(entries[0], entries[1])
灵活性问题


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

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

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')]

马蒂诺在我没有读到的评论中已经回答了这一点,因此,在应该得到信任的地方,信任是值得信任的。对不起

从评论中总结出各种解决方案(Satoru.Logic和mgilson在这里可能比我更值得称赞):

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


当您调用
format(条目[0],条目[1])
时,将是
format(关键字[obj1,obj2,obj3,…])
。然后,在
format
中,您正在迭代
条目[1][0]
,这意味着
obj2[0]
,忽略所有其他条目。这似乎不正确。例如,如果
obj2
实际上是字符串
'obj2'
,那就是字母
'o'
。因此,
[(关键字,x)对于条目[1][0]]
中的x将是
[('keyword','o')]

,如果我发现自己在很多地方使用
变量
作为
索引
作为
条目
,我会考虑将它命名为<代码> Tuple Po/<代码>或<代码>类< /代码>。另一点:也许您希望<代码>格式<代码>首先取一个参数(然后在内部拆分),这样您就可以做<代码> Fo=格式(条目)< /代码>。或者,也许
foo=format(*entries)
是最好的方法。如果看不到更多的基础设施,就很难确定最终会看起来有多干净。请注意,
格式可以通过
itertools.izip_longest
--
列表(itertools.izip_longest([]、['foo'、'bar'、'baz']、fillvalue='keyword'))
--很多时候你甚至不需要列表,iterable对象工作得很好:)对于
format()
我想你的意思是
return[(关键字,x)对于条目中的x]
@Biff:
entries
既是全局参数又是函数参数,在函数中,将使用参数。我还没有使用
itertools
,我们将对此进行研究。与python 3.3+中的
return
相比,
收益有什么优势?我看不出有什么不同(除了
return
将与早期版本一起使用。此外,它在python3中是
zip_最长的
。它不是
yield from
优于
return
,而是
yield from
的优势,如果你想让
format
成为一个实际的生成器函数。在大多数情况下,你可以真的不在乎任何一种方式,但如果你真的在乎,并且你在犹豫,你可能会说“不,用2.7或3.2循环并
产生
”太痛苦了,但是“是的,为什么不”用3.3。我猜我应该在回答中解释得更好。这当然会让我们知道指数是不必要的。我认为这是正确的答案,因为你让我意识到指数是不必要的。这只是说明如何修正我在我的评论中所指出的。我要利用这个契约。ed
*args
技巧。很抱歉,martineau,我是新来的,没有看到评论。我会相应地编辑我的帖子。Biff&Jamie:没问题,当有很多活动时,事情可能会变得很忙。欢迎来到StackOverflow
def format(keyword, entries):
    return [(keyword, x) for x in entries]

format(e[0], e[1])
[('spam', 'aa'), ('spam', 'bb'), ('spam', 'cc'), ('spam', 'dd')]
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)