我对编程有点陌生,我想比较python中的两个列表,而这些列表中的float可能有一个错误。举个例子:
first_list = [['ATOM', 'N', 'SER', -1.081, -16.465, 17.224],
['ATOM', 'C', 'SER', 2.805, -3.504, 6.222],
['ATOM', 'O', 'SER', -17.749, 16.241, -1.333]]
secnd_list = [['ATOM', 'N', 'SER', -1.082, -16.465, 17.227],
['ATOM', 'C', 'SER', 2.142, -3.914, 6.222],
['ATOM', 'O', 'SER', -17.541, -16.241, -1.334]]
预期产量:
Differences = ['ATOM', 'C', 'SER', 2.805, -3.504, 6.222]
到目前为止我的尝试:
def aprox (x, y):
if x == float and y == float:
delta = 0.2 >= abs(x - y)
return delta
else: rest = x, y
return rest
def compare (data1, data2):
diff = [x for x,y in first_list if x not in secnd_list and aprox(x,y)] + [x for x,y in secnd_list if x not in first_list and aprox(x,y)]
return diff
或者在元组的帮助下,但是我不知道如何构建近似值:
def compare (data1, data2):
first_set = set(map(tuple, data1))
secnd_set = set(map(tuple, data2))
diff = first_set.symmetric_difference(secnd_set)
return diff
希望你能帮助我!:)
可能是您可以迭代两个元素中的每个元素,然后比较子元素: 然后,当任何子元素不相等时,可以根据其类型(即如果两个)将其添加到结果中 字符串不相等,可以将其添加到结果中,或者如果它是float,
math.isclose()
可以用于近似:注:为匹配预期输出进行了更正,
first_list
的第三个元素中缺少负号输出:
这是有点笨重,但我做了它的飞行,它应该得到你想要的结果。正如我在代码中提到的,您将阈值设置为
0.2
,这意味着应该返回两行,而不是像您提到的那样返回一行。你知道吗两个注意事项,当每个for循环添加O(n)时,这将变得相当慢,对于列表中较大的列表,我将使用
itertools.izip
函数,我相信它是被调用的。希望这有帮助!你知道吗线路
不准确。。。 检查变量类型的正确方法是使用
type()
函数。。。 尝试将上面的行替换为相关问题 更多 >
编程相关推荐