如果“any”返回true python,则取值

时间:2013-05-13 13:05:01

标签: python

我正在尝试获取变量(m1)以从另一个列表(gcounter)中取出一些值,如果该列表中的值满足某些条件等于y-nMoments }并且不等于nMoments+1

m1=[[y if y!=nMoments+1 else any(y-nMoments) for y  in x] for x in gcounter]

此时此返回:

[[0, 0], [0, 2], [1, 1], [2, 0], [0, True], [1, 2], [2, 1], [True, 0]]

原始列表(gcounter)是:

[[0, 0], [0, 2], [1, 1], [2, 0], [0, 1], [1, 2], [2, 1], [1, 0]]

但我只想获得True的值,然后是数值,而不是真值。

有谁知道如何解决这个问题?我已经尝试将If语句放入第一行但是我遇到了语法错误。

我希望m1从原始列表中获取的内容是:

[[1,0] ,[0,1]]

3 个答案:

答案 0 :(得分:1)

我认为你想要的是在线之间阅读:

m1 = [x for x in gcounter if any(y - nMoments and y != nMoments + 1 for y in x)]

这会选择x(每个列表)中的所有gcounter,只有当该列表中有任何值(yy - nMoments不为0且{ {1}}不等于y

此测试可简化为:

nMoments + 1

答案 1 :(得分:1)

c = lambda x: all(map(lambda y: y == nMoments and y != nMoments+1,  x))
filter(c ,gcounter)

如果您希望条件满足子列表中的所有元素而不是所有元素,只需更改any()的all()即可。这将返回满足条件的原始列表的元素。

你遇到的问题是any()返回一个布尔值,这就是你得到[1,True]的原因

答案 2 :(得分:0)

我不完全理解你的问题,但听起来你想要列表理解语法的if部分:

>>> input_list = [1,2,3,4,5]
>>> [x for x in input_list if x != 2]
[1, 3, 4, 5]

docs还有一些例子