我有一个数字列表:
a = [3, 6, 20, 24, 36, 92, 130]
条件列表:
b = ["2", "5", "20", "range(50,100)", ">120"]
我想检查'a'中的数字是否符合'b'中的某个条件,如果是,请将这些数字放在列表'c'中
在上述情况中:
c = [20, 92, 130]
我创建了这个代码似乎做了我想做的事情:
c = []
for x in a:
for y in b:
if "range" in y:
rangelist = list(eval(y))
if x in rangelist:
c.append(x)
elif ">" in y or "<" in y:
if eval(str(x) + y):
c.append(x)
else:
if x == eval(y):
c.append(x)
但是我的名单'a'可能非常大。
是否有更简单,更快捷的方式来获得我想要的东西?
答案 0 :(得分:12)
在@ user2357112建议的基础上,您可以为所有条件创建一个函数列表,然后将每个数字传递给每个函数,以确定该数字是否符合任何条件。
In [1]: a = [3, 6, 20, 24, 36, 92, 130]
In [2]: conditions = [lambda x:x==2, lambda x:x==5, lambda x:x==20, lambda x: x in range(50, 100), lambda x: x > 120] # List of lambda functions
In [3]: output = list()
In [4]: for number in a:
...: if any(func(number) for func in conditions): # Check if the number satisfies any of the given conditions by passing the number as an argument to each function
...: output.append(number)
In [5]: output
Out[5]: [20, 92, 130]
答案 1 :(得分:4)
假设您可以更改b
以保持有效条件(当使用a
中的元素连同时),如上面的评论所述:
b = ["==2", "==5", "==20", "in range(50,100)", ">120"]
您可以使用这些条件合并a
的每个元素,并使用eval
检查它是否评估为True
或False
。当然,这可以在列表理解中完成:
result = [i for i in a if any(eval(str(i) + x) for x in b)]
答案 2 :(得分:2)
你想要简单,pythonic和易于掌握忘记上面
a = [3, 6, 20, 24, 36, 92, 130]
[i for i in a if i==2 or i==5 or i==20 or i>120 or 50<=i<=100 ]
答案 3 :(得分:1)
根据以前的答案,我认为还有两种方法。
#1
numbers = [3, 6, 20, 24, 36, 92, 130]
conditions = [
lambda n: n == 2,
lambda n: n == 5,
lambda n: n == 20,
lambda n: n in range(50, 100),
lambda n: n > 120,
]
result = [num for num in numbers for condition in conditions if condition(num)]
#2
condition = lambda n: n in {2, 5, 20} or 50 <= n <= 100 or n > 120
result = list(filter(condition, numbers))
对于一个非常大的列表,您应该使用示例#2,因为它更节省内存并且时间复杂度是线性的而不是二次类似#1