确定列表中第一个真实条件的pythonic方法

时间:2018-10-25 19:53:55

标签: python

我已经将许多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创建者it seems中将QRadioButton分组,没有一种简单的方法来设置ID。

1 个答案:

答案 0 :(得分:1)

一行...:

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时。