什么是更简洁,更pythonic的方式来进行以下枚举?

时间:2009-12-14 10:52:18

标签: python enumeration

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

4 个答案:

答案 0 :(得分:4)

您调用的内容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

答案 1 :(得分:2)

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

基本问题是:

1)这个instruments结构来自何处,为什么需要对其进行重新组织?

2)您呼叫self.table的{​​{1}}结构是什么?

3)你打算用这个SetValue结构做什么?

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

答案 2 :(得分:2)

你在评论中提到过,这个循环是异步函数的一部分(就扭曲的框架而言)。在这种情况下,你不想长时间阻止:

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

     

因为那就是你的样子   做。

@ [Ben Hughes]的评论我指的是:

  

我需要明确地调用SetValue(它的   在PyGridTableBase上)为每个值 -   因为这个代码是通过扭曲调用的   推迟的方法 - 我的大脑并不多   擅长整齐的循环/枚举   方式..... - Ben Hughes

答案 3 :(得分:-3)

一个选项是使用列表理解:

[self.table.setValue(row, col, value) 
    for row, instrument in enumerate(instruments) 
        for col, value in enumerate(instrument)]

不确定它是否是更整洁或更多的pythonic ......但它是表达循环的另一种方式。

有人可能会争辩说列表理解更清晰,因为“action”部分(setValue)位于第一位/顶部。而不是被埋在循环中。

修改

另一种方法,使用辅助函数和生成器表达式:

def loop(iterator):
    for item in iterator: pass

loop(self.table.setValue(row, col, value) 
    for row, instrument in enumerate(instruments) 
        for col, value in enumerate(instrument))

如果您确定循环体永远不会在布尔上下文中求值为True(任何()将在第一个True上停止迭代),则辅助函数可以是内置的any()。