Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
识别列表中第一个真实条件的pythonic方法_Python - Fatal编程技术网

识别列表中第一个真实条件的pythonic方法

识别列表中第一个真实条件的pythonic方法,python,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.boun

我有很多我已经组合在一个数组中的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。

一行…:

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

ret
初始化为
[40,-1,-1]
是否有意义?0是一个有效的索引,如果不满足任何条件,则不希望返回它…如果r.isChecked(),则可以使用
下一步(枚举(self.bounc1)中的i代表i,r)
而不是for循环。它还避免了在选中的第一个单选按钮上进行迭代。如果您试图返回最后一个索引,则可能会重复该单选按钮,还是所有索引?您的代码返回最后一个索引。列表理解中的零索引是什么?@LeKhan9这个答案构建了整个单选按钮列表,然后选择第一个元素。列表理解返回一个
列表
,因为他只想要第一个真正的结果,我们只切片到第一个元素。原始代码返回最后一个索引,所以它应该是[-1],但即使如此,也不能解释没有索引的情况checked@MrE,两头都很好。问题问了一件事,但代码做了另一件事。默认值也可以处理,但老实说,我只是认为,再做这一行就是减少回报。