以下行找到在一个句子中找到单词的位置:
print([i+1 for i in range(6) if a.split()[i] == b])
a
是句子的字符串(例如"hello world this is a sentence"
")和
b
是要在句子中找到的词(例如"world"
)
该程序有效,但我希望b
是用户输入,同时保持程序在一行。这可能吗?
谢谢 :)
编辑:我的意思是只应提示用户输入一次。如果已多次找到该字词,则将b
替换为input()
会多次提示。
答案 0 :(得分:3)
只需使用嵌入式列表理解,其中包含一个input()
项目。
print([i+1 for b in [input()] for i in range(6) if a.split()[i] == b])
示例:
>>> print([i+1 for b in [input()] for i in range(6) if a.split()[i] == b])
world
[2]
答案 1 :(得分:1)
是的:
print([i+1 for i in range(6) if a.split()[i] == input()])
答案 2 :(得分:1)
Inbar Rose已经展示了如何将input()
调用放在列表理解中,如果那个真的你想做什么,但我建议不要这样做。您应该尝试在程序结构的外部获取(并可能验证)用户输入,不要将其“隐藏”在执行实际计算的部分中。在代码深处埋入输入调用往往会降低灵活性并且难以调试。
这是一种更加Pythonic的方式来进行列表理解。当我们直接迭代单词列表时,它使用enumerate
来生成当前单词的索引,而不是使用range
并通过索引间接迭代单词列表。
此方法的另一个好处是a.split()
只执行一次,而在您的代码中a
被分成每个比较的列表。
a = "hello world this is a world sentence"
b = input("word: ")
print([i for i, u in enumerate(a.split(), 1) if u == b])
测试输出,提供world
作为输入
word: world
[2, 6]
当然,上面的代码可以写在一行:
a = "hello world this is a world sentence"; b = input("word: "); print([i for i, u in enumerate(a.split(), 1) if u == b])
但是传统的Python样式指南PEP008表示通常应该避免在脚本中的一行上放置多个语句。但是,在交互式解释器中工作时,将多个语句组合成一行可能很方便,但即便如此,也存在限制。