首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python for循环:将值应用于一个索引,另一个应用于其他索引

Python for循环:将值应用于一个索引,另一个应用于其他索引
EN

Stack Overflow用户
提问于 2018-03-08 20:10:10
回答 3查看 65关注 0票数 1

我正在尝试创建一个程序,允许游戏评审人员输入游戏属于哪些类别,然后它应该用复选框打印适当的类别,用空白框打印其他类别。

我已经成功地编写了一个for循环,它用复选框打印出正确的类别,但是我很难用一个空白框循环遍历其余的值来打印它们。

代码语言:javascript
复制
yes = '\u2611' #checkbox
no = '\u2610' #blank box

audience_list = ["Kids", "Everyone", "Casual Players", "Pro Players"]
audience= int(input("1. Kids, 2. Everyone, 3. Casual 4. Pro: "))

print ("===[ Audience: ]===")

for i in audience_list: #cycles through the list of audience options
    if i == audience_list[audience-1]: #for the audience option that was selected, print it with a check box
        print ("%s %s" % (yes, audience_list[audience-1]))
    else: #for the audience options weren't selected, print them with a blank checkbox
        print ("%s %s" % (no, audience_list))

除了分配给“受众”变量的索引外,还有什么方法可以让我打印所有索引吗?

我正在使用Python3.2.3。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-08 20:18:26

只需打印i!如果打印audience_list,您将输出每个元素的整个列表;而i是当前正在检查的元素。

代码语言:javascript
复制
for i in audience_list:
    if i == audience_list[audience-1]:
        print ("%s %s" % (yes, audience_list[audience-1]))
    else:
        print ("%s %s" % (no, i))

一个测试(已经进入3)提供了一个整洁的输出:

代码语言:javascript
复制
☐ Kids
☐ Everyone
☑ Casual Players
☐ Pro Players
票数 1
EN

Stack Overflow用户

发布于 2018-03-08 20:23:04

考虑枚举列表项:

代码语言:javascript
复制
audience_list = ["Kids", "Everyone", "Casual Players", "Pro Players"]
choice = 3  # Casual.

for (index, name) in enumerate(audience_list, start=1):
    if index == choice:
        print("[X] " + name)
    else:
        print("[ ] " + name)

输出:

代码语言:javascript
复制
[ ] Kids
[ ] Everyone
[X] Casual Players
[ ] Pro Players
票数 1
EN

Stack Overflow用户

发布于 2018-03-08 21:14:00

我要回答这个问题,因为我觉得其他的答案还没有回答你的基本问题。

下面是我建议的代码:

代码语言:javascript
复制
yes = '\u2611' #checkbox
no = '\u2610' #blank box

audience_list = ["Kids", "Everyone", "Casual Players", "Pro Players"]
audience= int(input("1. Kids, 2. Everyone, 3. Casual 4. Pro: "))
selection = audience_list[audience-1]

print ("===[ Audience: ]===")

for option in audience_list: #cycles through the list of audience options
    print ("%s %s" % (yes if option == selection else no, option))

这里有两大变化。

首先,我在selection循环之外创建了变量for。这样可以清理你的循环,并且更接近你正在做的事情。您不关心号码,您关心的是用户选择的内容。

其次,我将for循环的if部分放入print语句中。这是为了突出一些重要的内容:在循环的每一次迭代中,您唯一想要的区别是是否选中了该框。无论哪种方式,都希望打印audience_list的元素。这个打印语句显示。您可以打印空框,也可以打印选中的框,无论哪种方式,都要打印元素。

请注意,您的for i.可能产生了一些混淆,因为通常这样的i是一个int。因此,我将我的for循环迭代器更改为option,这显然是一个字符串。

我想你的主要问题已经解决了。您可以在“是”和“否”行中打印audience_list[audience-1],也可以更简单地在两行中打印i。(或者,根据乔的代码,您可以创建一个audience_list[audience-1]和一个i,因为在编写的过程中,它们都是相同的。)但是,由于您正在遍历所有选项,除了框之外,您应该打印相同的选项字符串,不管它是否被选中。

注意,在我对Joe的评论中,我提到您可以将for循环和下面的全部压缩到一行中。那么您的代码将如下所示:

代码语言:javascript
复制
yes = '\u2611' #checkbox
no = '\u2610' #blank box

audience_list = ["Kids", "Everyone", "Casual Players", "Pro Players"]
audience= int(input("1. Kids, 2. Everyone, 3. Casual 4. Pro: "))
selection = audience_list[audience-1]

print ("===[ Audience: ]===")

_ = list(map(lambda o: print ( "%s %s" % (yes if o == selection else no, o)), audience_list))

这在逻辑上是等价的,但很难理解,因此,尽管这样做很有趣,但我不推荐它。(简单地说:map接受一个函数,在本例中是未命名的lambda函数,并通过该函数运行迭代器audience_list的每个成员。list是使map对象实际进行处理所必需的,而_ =只是告诉其他读者我们正在丢弃列表。)

正如Joe提到的,有一种不那么丑陋的方法可以不需要映射。最后一行可以是:

代码语言:javascript
复制
_ = [print ( "%s %s" % (yes if o == selection else no, o)) for o in audience_list]

这稍微少了一些混乱,因为它消除了list(map(噪声。

它们在功能上几乎都是等价的。虽然把东西扔进一行是很有趣的,但不要迷失在其中。可读性、可维护性和易于调试的能力是最关键的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49181652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档