有什么更简洁、更像Python的方法来完成下面的枚举?

2024-04-19 18:55:45 发布

您现在位置:Python中文网/ 问答频道 /正文

for row, instrument in enumerate(instruments):
    for col, value in enumerate(instrument):
         self.table.SetValue(row, col, value)

Tags: inselfforvaluetablecolrowinstrument
3条回答

根本问题不在于这个循环。在

基本问题是:

1)这个instruments结构来自何处,为什么需要重新组织它?在

2)您调用的self.table结构是什么?在

3)你打算怎么处理这个self.table结构?在

在回答这些问题之前,示例Python代码没有可用于评估的上下文。只是密码。在

您所调用的row不是一个行,而是一个行索引。instrument是一行。除此之外:

如果您拥有的唯一工具是一个SetValue(row_index, column_index, value)方法,并且该方法不仅仅帮助复制instruments的结构,并且instruments集合如您的代码所描述的那样,那么没有更好的方法。它已经比

#WARNING: BAD PRACTICE! DON'T USE THIS CODE!
for row_index in xrange(len(instruments)):
    instrument = instruments[row_index]
    for column_index in xrange(len(instrument)):
        self.table.SetValue(row_index, column_index, instrument[column_index])

或任何歪曲事实的行为。在

否则,您可能会对import copy; self.table = copy.copy(instruments)或者甚至(正如SilentGhost所建议的那样)self.table = instruments

您已经在评论中提到这个循环是异步函数的一部分(在twisted框架中)。在这种情况下,您不想长时间阻止:

from twisted.internet import task

for i, row in enumerate(instruments):
    task.coiterate(self.table.SetValue(i, j, v) for j, v in enumerate(row))

因此,所有行都是并行分配的。在

注:

  • 注意irow的后期绑定。在这种情况下使用(lambda i=i, row=row: ...)()。在
  • task.coiterate()使用全局对象,因此可以同时进行多个表更新(这可能不是您想要的)。在

以下是@SilentGhost' answer(已删除):

self.table = instruments

Because that's what you seem to be doing.

我指的是本休斯的评论:

I need to explicity call SetValue (its on a PyGridTableBase) for each value - as this code is invoked via a twisted deferred method - my brain is not much good at looping/enumeration in a neat way..... – Ben Hughes

相关问题 更多 >