从列表中提取信息

时间:2013-05-09 04:24:41

标签: python list range

我想要比较两个列表并创建另一个列表作为结果

list1 = [0.5, 1]
list2 = [0.0, 0.4, 0.5, 0.6. 0.75, 0.99, 1]

我想创建第三个列表,其中包含list1

中2个元素之间list2中的所有数字
list3 = [0.5, 0.6, 0.75, 0.99, 1]

我试过了:

 for i in range(list1[0], list1[1], step):
    print i

但我的步骤在每种情况下都不一样,所以它不起作用,我还能尝试什么呢?

干杯!

2 个答案:

答案 0 :(得分:4)

range仅返回整数。你可能想要这样的东西:

for i in list2:
    if i > list1[0] and i < list1[1]:
        print i

如果需要,您可能希望将>更改为>=,将<更改为<=

如果你想直接构建list3,请尝试:

list3 = [i for i in list2 if i > list1[0] and i < list1[1]]

修改

为了更好的衡量,你也可以这样做(这就是你用数学方法写的):

list3 = [i for i in list2 if list1[0] < i < list1[1]]

答案 1 :(得分:1)

list1 = [0.5, 1]
list2 = [0.0, 0.4, 0.5, 0.6, 0.75, 0.99, 1]

low, high = list1
lst = [x for x in list2 if low <= x <= high]
print(lst)

为了便于阅读,我们将第一个列表解压缩为两个变量lowhigh

我们使用列表推导来从list2获取值。列表推导有一个“过滤器”表达式,只选择我们想要的值。

最好直接迭代列表的值,而不是尝试使用range()将索引放入列表中。代码更容易编写,更容易阅读,作为奖励它更快。

列表推导解决方案是在Python中解决此问题的推荐方法。

Matthew Graves建议“你可以在这里做一个lamba / map函数”。我会解释如何做到这一点。

filter()需要你传递一个函数;您可以定义一个函数,或使用lambda关键字来创建一个匿名函数。 lambda必须是单个表达式,但幸运的是,在这种情况下,这就是我们所需要的。

low, high = list1
def check_low_high(x):
    return low <= x <= high

lst = list(filter(check_low_high, list2))

lst = list(filter(lambda x: low <= x <= high, list2))

在Python 2.x中,您实际上不需要调用list(),因为filter()会返回一个列表。在Python 3.x中,filter()是“懒惰的”并返回一个迭代器。