用户输入只有列表理解一次

时间:2016-02-28 16:31:59

标签: python python-3.x

以下行找到在一个句子中找到单词的位置:

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()会多次提示。

3 个答案:

答案 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表示通常应该避免在脚本中的一行上放置多个语句。但是,在交互式解释器中工作时,将多个语句组合成一行可能很方便,但即便如此,也存在限制。