说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
itertools.dropwhile() 是 Python itertools 模块中的一个函数,用于根据一个谓词函数丢弃可迭代对象中满足条件的元素,一旦遇到不满足条件的元素,则开始返回剩余的所有元素。
语法 itertools.dropwhile(predicate, iterable)
创建一个迭代器,如果 predicate (谓语) 为 true,迭代器丢弃这些元素,然后返回其他元素。注意,迭代器在 predicate 首次为 false 之前不会产生任何输出,所以可能需要一定长度的启动时间。
itertools.dropwhile(predicate, iterable)
返回一个迭代器,丢弃可迭代对象中从开始满足谓词条件的元素,一旦遇到第一个不满足谓词条件的元素,则返回剩余的所有元素。
大致相当于:
def dropwhile(predicate, iterable):
# dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
iterable = iter(iterable)
for x in iterable:
if not predicate(x):
yield x
break
for x in iterable:
yield x
predicate 是一个可调用对象,将 iterable 中的元素传入 predicate 得到 false 后开始返回后续其他元素(不再判断 predicate):
import itertools
foo = itertools.dropwhile(lambda x: x < 8, [1,3,1,5,6,8,1])
[*foo]
# [8, 1]
import itertools
data = [1, 2, 3, 4, 5, 6, 7, 8]
result = itertools.dropwhile(lambda x: x < 5, data)
print(list(result))
# 输出:
# [5, 6, 7, 8]
import itertools
data = 'abcdefg'
result = itertools.dropwhile(lambda x: x < 'd', data)
print(''.join(result))
# 输出:
# defg
import itertools
data = [1, 3, 5, 7, 2, 4, 6, 8]
result = itertools.dropwhile(lambda x: x % 2 == 1, data)
print(list(result))
# 输出:
# [2, 4, 6, 8]
假设我们有一个日志文件,包含时间戳和日志消息。我们希望丢弃某个时间点之前的所有日志消息。
示例日志文件内容
logs = [
"2023-07-01 10:00:00 Log entry 1",
"2023-07-01 10:05:00 Log entry 2",
"2023-07-01 10:10:00 Log entry 3",
"2023-07-01 10:15:00 Log entry 4",
]
目标:丢弃 10:05:00 之前的所有日志消息:
[
"2023-07-01 10:05:00 Log entry 2",
"2023-07-01 10:10:00 Log entry 3",
"2023-07-01 10:15:00 Log entry 4",
]
实现代码
import itertools
# 示例日志文件内容
logs = [
"2023-07-01 10:00:00 Log entry 1",
"2023-07-01 10:05:00 Log entry 2",
"2023-07-01 10:10:00 Log entry 3",
"2023-07-01 10:15:00 Log entry 4",
]
# 定义要丢弃之前的时间点
cutoff_time = "2023-07-01 10:05:00"
# 使用 itertools.dropwhile 丢弃时间点之前的所有日志消息
filtered_logs = itertools.dropwhile(lambda log: log.split()[1] < cutoff_time, logs)
# 输出过滤后的日志消息
for log in filtered_logs:
print(log)
解释:
itertools.dropwhile(lambda log: log.split()[1] < cutoff_time, logs)
丢弃时间点之前的日志消息,lambda log: log.split()[1] < cutoff_time
是谓词函数,比较日志消息的时间戳和时间点。输出结果
2023-07-01 10:05:00 Log entry 2
2023-07-01 10:10:00 Log entry 3
2023-07-01 10:15:00 Log entry 4
这个实用案例展示了如何使用 itertools.dropwhile 根据条件丢弃数据,直到遇到第一个不满足条件的数据为止,适用于需要根据某些条件过滤数据的场景。
更新时间:2024-07-03 21:47:31 标签:python itertools 迭代 丢弃