python-3.x 从“any”迭代器操作变量

7jmck4yq  于 2023-01-18  发布在  Python
关注(0)|答案(2)|浏览(172)

我正尝试为我的程序制作一个可读性更强的日志消息。
为了这个目的,我正在寻找一种方法来实现某种高级的“any”迭代器。
它应该返回满足数据索引的索引或迭代单元格本身,而不是只在满足条件时返回True/False。
下面是一个可能的伪代码,用于说明:

messages = [(0, None),(1, None), (2, "data")]

if any(data is not None for id, data in messages):
    print(f"Tuple with data has id: {id} and data: '{data}'.") 
else:
    print(f"There is no message with filled data")

# should output: "Tuple with data has id: 2 and data: 'data'."

我尝试了几种方法,比如使用walrus运算符、使用***global***运算符、在***if***运算符中打印,甚至实现自己的迭代器
(but这个主题对我来说是新的,所以可能它仍然可以是一个解决方案)
我想避免任何额外的*for循环,以获得更好的优化、可读性和对python的掌握。
感谢您提前提出的任何想法!

mwkjh3gx

mwkjh3gx1#

使用一个for循环,当找到匹配的元素时跳出。如果你没有跳出,打印消息说什么都没有找到。

for id, data in messages:
    if data is not None:
        print(f"Tuple with data has id: {id} and data: '{data}'.")
        break
else:
    print(f"There is no message with filled data")
7tofc5zh

7tofc5zh2#

如果你真的想要类似于你已经写过的东西,你可以在一个过滤生成器表达式上使用next()并捕获StopIteration,但是我个人认为使用像Barmar suggested这样的普通for循环更清晰。

try:
    id_, data = next((id_, data) for id_, data in messages if data is not None)
except StopIteration:
    print("There is no message with filled data")
else:
    print(f"Tuple with data has id: {id_} and data: '{data}'.")

(Here我还避免使用shadowing,即内置的id函数。)

相关问题