我有一个执行此操作的python代码:
这是字典的类型:
{'ID1':['100,Cat','100,Cat1','100,Cat2','100,Cat3','99.4,Dog','99.4,Dog1','99.4,Dog3','100,Cat5','100,Cat6']}
现在我必须过滤字典的值:
1-根据%进行过滤:因此,我确定了%的第一个值,在本例中为100,裕度为0.05。据此,我会得到
['100,Cat','100,Cat1','100,Cat2','100,Cat3']
所以我做了这段代码:
for keys_ID in dictionary.keys():
list_2 = []
list_ID = []
treshold = dictionary[keys_ID][0].split(',')[0]
for thre in dictionary[keys_ID]:
thre_split_ID = thre.split(',')[0]
thre_split_species = thre.split(',')[1].rstrip('\n')
if float(thre_split_ID) >= float(treshold) - 0.05 and float(thre_split_ID) <= float(treshold) + 0.05:
if thre_split_species not in list_2:
list_2 .append(thre_split_species )
list_ID.append(thre_split_ID)
但是,这段代码给了我以下输出:
['100,Cat','100,Cat1','100,Cat2','100,Cat3','100,Cat5','100,Cat6']
在这种情况下,代码返回的值具有相同的%。
这是所需的输出:['100,Cat','100,Cat1','100,Cat2','100,Cat3']
谁能告诉我只获得最初相同结果的方法吗?谢谢
答案 0 :(得分:0)
根据我对问题的理解,您正在寻找的值在第一个值的0.5以内,直到您找到一个不同的值。为此,您可以将else: break
添加到if
条件中,以检查阈值以停止循环
或者,您可以使用例如itertools.takewhile
:
from itertools import takewhile
val = lambda x: float(x.split(",")[0])
dictionary = {'ID1':['100,Cat','100,Cat1','100,Cat2','100,Cat3','99.4,Dog','99.4,Dog1','99.4,Dog3','100,Cat5','100,Cat6']}
for ID in dictionary.keys():
first, *rest = dictionary[ID]
filtered = [first, *takewhile(lambda x: abs(val(first) - val(x)) < 0.5, rest)]
print(filtered)
输出:
['100,Cat', '100,Cat1', '100,Cat2', '100,Cat3']