0

我正在做以下事情,它可以工作,但它并不优雅。我想知道是否有人对更漂亮的方法有任何见解。

假设我有 n 个布尔值,用户将设置为 true 或 false。对于每个布尔值,都有一个关联的函数 do_something,它将名为 myList 的多维列表中的下一个未处理列作为输入。下面的代码就是这样做的:

i=0
if boolean1:
    do_something1([a[i] for a in myList])
    i+=1
if boolean2:
    do_something2([a[i] for a in myList])
    i+=1
if boolean3:
    do_something3([a[i] for a in myList])
    i+=1
...

尽管它有效,但我内心的某些东西告诉我,有一种更优雅的方法可以做到这一点。似乎最好将列推送到队列中,然后在满足其中一个布尔值时将它们弹出。但这似乎是一大笔开销。有没有人有什么建议?

4

3 回答 3

1

首先转置myList(将行翻转为列),然后对其进行迭代。

for boolean, row in zip(booleans, zip(*myList)):
    if boolean:
        process(row)

内部zip是 idiom 的一部分zip(*l),它转置一个列表。

于 2013-06-11T19:17:07.110 回答
1

像这样的东西?

processing = ((boolean1, do_something1), (boolean2, do_something2), 
              (boolean3, do_something3))
i=0
for b, process in processing:
    if b:
        process[(a[i] for a in myList])
        i+=1
于 2013-06-11T19:18:58.213 回答
1

如果您可以将布尔值和函数放入列表中,您可以这样做:

processing = zip(booleans, functions)

for i, action in enumerate([p for (b,p) in processing if b]):
    action([a[i] for a in myList])
于 2013-06-11T19:22:56.113 回答