繁体   English   中英

使用 for 循环获取多个输入的更好方法?

[英]Better way for taking multiple inputs with a for loop?

我想使用 for 循环来获取我必须接收的许多问题的输入。 我设法编写了一些代码,但似乎应该有更好的方法。 也许我可以减少我使用的变量数量?

## <Desired Result>
## onset : 3mo
## location : earth
## character : red
checks = ['onset','location','character']
l1 = ['onset','location','character']
l2 = ['onset','location','character']

for i in range(len(checks)):
    l2[i] = input(checks[i])

for i in range(len(checks)):
    print(l1[i]+" : "+l2[i])

关于您的代码的一些观察:

  1. 请注意,您实际上从未更改过l1因此基本上没有必要更改它,并且无论您在哪里使用l1替换checks

  2. 不必以这种方式定义l2因为无论如何您都要覆盖它的所有值,因此您只需定义l2 = [] ,然后在循环中使用append

     for i in range(len(checks)): l2.append(input(checks[i])) 
  3. 两个循环的范围完全相同,因此可以将它们组合为1:

     for i in range(len(checks)): l2[i] = input(checks[i]) print(l1[i]+" : "+l2[i]) 

现在,使用list-comprehension和字符串的join方法,您实际上可以将此代码减少到3行(并摆脱l1 ):

checks = ['onset', 'location', 'character']

l2 = [input(x) for x in checks]

print("\n".join(checks[i]+" : "+l2[i] for i in range(len(checks))))

或更整洁地使用zip

print("\n".join(check + " : " + ans for check, ans in zip(checks, l2)))

最后,减少更多的行(并摆脱l2 ):

checks = ['onset', 'location', 'character']

print("\n".join(check + " : " + input(check) for check in checks))

我们还可以避免使用join并利用机会使用print的额外参数和list-unpacking进一步减少到一行(摆脱checks ):

print(*(check + " : " + input(check) for check in ['onset', 'location', 'character']), sep='\n')

您想要实现的目标是使用List comprehensions完成的。

在您的情况下,您可以单行执行此操作。

l2 = [input(x) for x in checks]

对于真正的for循环一线解决方案,您可以像这样进行列表理解:

l2 = [(n, print(l1[i]+" : "+n))[0] for i, n in enumerate([input(x + ": ") for x in checks])]

输出继电器:

onseta
locationb
characterc
onset : a
location : b
character : c

编辑

正如其他人提到的那样,这不是最佳做法,因此请使用以下方法:

checks = ['onset','location','character']

l2 = [input(f"Check {n}:\n > ") for n in checks]

print(*(f"{j}: {l2[i]}\n" for i, j in enumerate(checks)), sep="")

输出:

Check onset:
 > ok
Check location:
 > ok
Check character:
 > ok
onset: ok
location: ok
character: ok

您不应初始化所需长度的列表并为每个元素输入内容。 您可以使用append方法。

以下代码将帮助您:

checks = ['onset','location','character']
arr = []
for i in checks:
    arr.append(input(i + ' : '))

如果要减少行数,可以尝试以下操作:

arr = [ input(i + ' : ') for i in ['onset','location','character']]

尝试这个:

answer_tuples = [(question, input("Input answer for question " + question + ": ")) for question in checks]

这基本上是其他人建议的内容,不同之处在于我使用列表理解来question, answer元组(以防万一您要打印或在路上使用它们)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM