python - 过滤字符串列表
问题描述
我有一个执行此操作的 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.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']
推荐阅读
- javascript - React Native Animated 不会在 FlatList 中触发 onScroll 事件
- javascript - 试图停止更新面板内的繁忙指示器
- python - 我如何每 6 小时提及一个不和谐机器人的用户列表-python
- sql - 如何使用多列上的条件选择“分组依据”组中的特定行?
- python - 运行 dataframe.head().to_dict() 后给出了 keyerror 消息
- c# - 具有动态的 EF Core 或 Where 子句
- vba - 哪个循环函数更适合读取单元格并获得总数?
- ios - 无法在 IOS 14 中与 UIActivityViewController 共享视频
- sql - 根据时间戳过滤 SQL Server 行
- python - 在 sqlalchemy 中返回具有特定列的对象数组