如何比较Python中的列表?

问题描述:

我有一个列表如何比较Python中的列表?

a = [1.0, 2.0, 2.1, 3.0, 3.1, 4.2, 5.1, 7.2, 9.2] 

我想比较这个名单与其他名单也是我想提取关于数字order.All其他列表列表内容的信息具有相同的a的元素。

所以我已经试过这

a = [1.0, 2.0, 2.1, 3.0, 3.1, 4.2, 5.1, 7.2, 9.2] 
b = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
print dict(zip(a,b)) 

a1=[2.1, 3.1, 4.2, 7.2] 

我想用一个比较A1和提取字典值[3, 5, 6, 8]

通过 a1

只是循环,看看是否有你所创建的字典匹配键:

mapping = dict(zip(a, b)) 
matches = [mapping[value] for value in a1 if value in mapping] 

演示:

>>> a = [1.0, 2.0, 2.1, 3.0, 3.1, 4.2, 5.1, 7.2, 9.2] 
>>> b = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> a1 = [2.1, 3.1, 4.2, 7.2] 
>>> mapping = dict(zip(a, b)) 
>>> [mapping[value] for value in a1 if value in mapping] 
[3, 5, 6, 8] 

然而,考虑到您正在使用浮点数字。由于浮点数是二进制近似到十进制值,因此您可能无法精确匹配值;价值2.999999999999999(15九)例如,可以由Python str()功能3.0呈现,但不等于3.0

>>> 2.999999999999999 
2.999999999999999 
>>> str(2.999999999999999) 
'3.0' 
>>> 2.999999999999999 == 3.0 
False 
>>> 2.999999999999999 in mapping 
False 

如果您输入列出a进行排序,你可以使用math.isclose() function (或它的反向移植),连同bisect module保持匹配高效:

import bisect 
try: 
    from math import isclose 
except ImportError: 
    def isclose(a, b, rel_tol=1e-09, abs_tol=0.0): 
     # simplified backport, doesn't handle NaN or infinity. 
     if a == b: return True 
     return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) 

result = [] 
for value in a1: 
    index = bisect.bisect(a, value) 
    if index and isclose(a[index - 1], value): 
     result.append(b[index - 1]) 
    elif index < len(a) and isclose(a[index], value): 
     result.append(b[index]) 

这测试高达从a每个输入值两个值;一个保证等于或者低于(在index - 1)和下一个更高的值。对于您的样本a,值2.999999999999999被平分为索引3,在2.13.0之间。由于isclose(3.0, 2.999999999999999)为真,因此仍然会让您将该值映射到b中的4

+0

Peters谢谢。列表中的数字是执行FORTRAN代码的结果,用f11.5格式化。所以我认为简单版本就足够了! –

+0

对,如果你有*字符串*,那么你很好地解决了这个问题。 –