我正在做以下事情,它有效,但它并不优雅。我想知道是否有人对更漂亮的方法有任何见解。
假设我有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
...
即使它有效,但我的一些东西告诉我,有一种更优雅的方式来做到这一点。似乎将列推入队列然后在其中一个布尔值满足时弹出它们会更好。但这似乎是一大笔开销。有没有人有任何建议?
答案 0 :(得分:1)
首先转置myList
(将行翻转到列中),然后迭代它。
for boolean, row in zip(booleans, zip(*myList)):
if boolean:
process(row)
内部zip
是成语zip(*l)
的一部分,用于转置列表。
答案 1 :(得分: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
答案 2 :(得分: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])