Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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
Python 如何检查列表“a”中的元素是否满足列表“b”中的条件?_Python_Python 3.x_List_List Comprehension - Fatal编程技术网

Python 如何检查列表“a”中的元素是否满足列表“b”中的条件?

Python 如何检查列表“a”中的元素是否满足列表“b”中的条件?,python,python-3.x,list,list-comprehension,Python,Python 3.x,List,List Comprehension,我有一个数字列表: 以及一份条件清单: 我想检查“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:

我有一个数字列表:

以及一份条件清单:

我想检查“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”可能非常大。 有没有一种更简单、更快的方法来获得我想要的东西?

假设您可以将b更改为与a中的元素关联时保持有效的条件,如上面的评论所述:

b = ["==2", "==5", "==20", "in range(50,100)", ">120"]
您可以使用这些条件将a的每个元素关联起来,并使用来检查其计算结果是否为True或False。当然,这可以在列表中完成:

result = [i for i in a if any(eval(str(i) + x) for x in b)]

基于@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
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中那样的二次复杂度

为什么要在条件中保存字符串而不是整数,这会让事情变得更简单。你能将b更改为有效条件,如=20或范围50100吗?将函数放入b列表中,而不是执行一系列简陋的字符串操作和求值,看起来更干净。类似lambda x:x>120或lambda x:50的东西这在Haskell中是一个有趣的练习,因为它涉及到定义一个反向映射,这可能在Haskell stdlib中,但我找不到类型为a->[a->[b]->[b]的反向映射。当然更喜欢这个解决方案,比如lambda是如何创造性地使用的。非常好的解决方案,但我如何将列表“b”更改为lambda条件?@Reman我已将列表b中的所有条件转换为lambda函数,并将它们存储在列表条件中。@GaneshTata,是的,我已经看过了,但是我不可能在我的列表b中有lambda函数。我有一张有问题的“b”名单。我必须调整它们,包括lambda函数。。使用列表理解?类似这样的条件=[x:x=+a if a.isdigit elif x:x in+a if range in a else a:a+a for a in b]找到它:[x:x=+a if a.isdigit else x:x in+a if range in a else a:a+a for a in b]Tnx,如果你取a=[3,6,20,24,36,92,130,180,182,190]和b=['==2','in Range150200','180是一个数字,而不是一个条件。程序将两个字符串连接起来,Python将所有值都解释为True。您可以使用printnot3180检查这一点。如果我使用上述列表,则结果为'130'。
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]
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 ]
#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))