如何比较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.1
和3.0
之间。由于isclose(3.0, 2.999999999999999)
为真,因此仍然会让您将该值映射到b
中的4
。
Peters谢谢。列表中的数字是执行FORTRAN代码的结果,用f11.5格式化。所以我认为简单版本就足够了! –
对,如果你有*字符串*,那么你很好地解决了这个问题。 –