如何检查列表'a'中的元素是否符合列表'b'中的条件?

时间:2017-11-26 08:43:24

标签: python python-3.x list list-comprehension

我有一个数字列表:

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'可能非常大。
是否有更简单,更快捷的方式来获得我想要的东西?

4 个答案:

答案 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检查它是否评估为TrueFalse。当然,这可以在列表理解中完成:

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