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