我正在尝试获取变量(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]]
答案 0 :(得分:1)
我认为你想要的是在线之间阅读:
m1 = [x for x in gcounter if any(y - nMoments and y != nMoments + 1 for y in x)]
这会选择x
(每个列表)中的所有gcounter
,只有当该列表中有任何值(y
)y - 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还有一些例子