Python - 小于或等于与两个列表进行比较?

时间:2013-05-09 21:06:38

标签: python list compare

Python的新手,所以这可能是一个愚蠢的问题,但经过一天的研究和执行代码后,我无法弄清楚这一点。

我想取两个整数列表(结果和设置)并按以下格式进行比较:

(Setting# - 0.1) <= Result# <= (Setting# +0.1)

我需要为列表中的所有#做这个。

例如,如果Result1=4.6Setting1=4.3,我希望它比较4.2&lt; = 4.6&lt; = 4.4(这会导致失败,因为它远远超出我的容忍度0.1。一旦比较了,我希望它继续通过列表,直到完成为止。

这似乎不起作用,因为我有它。有什么想法吗?

results = [Result1, Result2, Result3, Result4, Result5, Result6]
settings = [Setting1, Setting2, Setting3, Setting4, Setting5, Setting6]
for n in results and m in settings:
    if (m-.1) <= n <= (m+.1): #compare values with a + or - 0.1 second error tolerance
    print 'ok'
else:
    print 'fail'
print 'Done'

4 个答案:

答案 0 :(得分:3)

您需要使用zip一前一后地迭代resultssettings

for n, m in zip(results, settings):
    if m - 0.1 <= n <= m + 0.1:
        print 'ok'
    else:
        print 'fail'
print 'Done' 

答案 1 :(得分:1)

您需要使用zip()来合并两个列表:

for n, m in zip(results, settings):
    if (m-.1) <= n <= (m+.1):
        print 'ok'
    else:
        print 'fail'

zip()通过组合每个输入序列中的每个第n个元素创建一个新列表:

>>> a = range(5)
>>> b = 'abcde'
>>> zip(a, b)
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e')]

您可以使用all()进行短路测试; all()会尽快返回False。我们在这里使用itertools.izip()来避免创建一个全新的列表,其中可能只测试前几对:

from itertools import izip

if all((m-.1) <= n <= (m+.1) for n, m in izip(results, settings)):
    print 'All are ok'
else:
    print 'At least one failed'

答案 2 :(得分:1)

并且几乎总是使用list和python,它可以在一行中完成:

print('ok' if all(setting - 0.1 <= result <= setting + 0.1 
    for setting, result in zip(settings, results)) else 'fail')

答案 3 :(得分:0)

Setting = [4,3,5,6]
Result = [3,3.02,5.001,8]

print([ (x - 0.1) <= y <= (x + 0.1) for x,y in zip(Setting, Result)])

你得到的结果是布尔值列表

>>> 
[False, True, True, False]