首页 > 解决方案 > pythonic方法来识别列表中的第一个真实条件

问题描述

我有很多 QRadioButton 我已经分组在一个数组中

self.bounc1 = [self.bounc1_no, self.bounc1_1, self.bounc1_2, self.bounc1_3, self.bounc1_4, self.bounc1_5, self.bounc1_6]
self.bounc2 = [self.bounc2_no, self.bounc1_2, self.bounc2_2, self.bounc2_3, self.bounc2_4, self.bounc2_5, self.bounc2_6]

我必须返回一个列表,其中包含 [40,已检查收音机 1 的索引,已检查收音机 2 的索引],我可以使用类似的代码

ret = [40, 0, 0]
for i in range(7):
    if self.bounc1[i].isChecked():  ret[1] = i
for i in range(7):
    if self.bounc2[i].isChecked():  ret[2] = i
self.sendSerial.emit(ret)

有没有办法让它像

self.sendSerial.emit([40, ...... , ......])

谢谢

PS:我在 Qt creator 中对 QRadioButton 进行了分组,似乎没有简单的方法来设置 ID。

标签: python

解决方案


一条线...:

self.sendSerial.emit([40, [i for i, x in enumerate(self.bounc1) if x.isChecked()][0], [i for i, x in enumerate(self.bounc2) if x.isChecked()][0]])

但老实说,这不太可读。

结合@Bakuriu的评论,缩短它的一种方法是:

self.sendSerial.emit([40] + list(map(lambda x: next(i for i, r in enumerate(x) if r.isChecked() if any(r.isChecked() for r in x) else 0, (self.bounc1, self.bounc2)))

同样,您可以看到它是多么做作,尤其是默认值为 0。


推荐阅读