如何让它正确迭代?

时间:2018-03-05 20:34:27

标签: python-3.x

我正在尝试提供有关X号受害者的信息。 首先输入了多少受害者。 下一个输入" name"," age"和#34;社交媒体"为每个受害者。 最后将其全部写入文件。

受害者可以拥有超过1个Instagram帐户或超过1个Snapchat帐户,我希望能够输入Instagram 1,Instagram 2,Instagram 3等。为每个受害者并返回"菜单"为给定的受害者选择更多社交媒体帐户输入。

当我重复这个时,出了点问题。 FX。对于我添加的每个Instagram帐户,它不会计算+1。

此外,我无法为受害者2,3,4等输入社交媒体。它只是跳过它并结束脚本。

我可能接近这一切都错了,为什么我寻求帮助来学习正确的方法。 :)

# SOCIAL MEDIA
instagram = []
snapchat = []
twitter = []
youtube = []
other = []
social_media = True


# Get input of victims.
number_of_victims = int(input("How many victims: "))
confirm_social_media = input("\nAny social media? y or n: ")
victim_names = []
victim_ages = []
if confirm_social_media == "n":
    for i in range(1, number_of_victims + 1):
        victim_names.append(input("Name of victim " + str(i) + ": "))
        victim_ages.append(input("Age of victim " + str(i) + ": "))
    print(victim_names, victim_ages)
else:
    for i in range(1, number_of_victims + 1):
        victim_names.append(input("Name of victim " + str(i) + ": "))
        victim_ages.append(input("Age of victim " + str(i) + ": "))
        while social_media != "":
            social_media = input("\nType of social media: "
                                 "\n'i' = Instagram"
                                 "\n's' = Snapchat"
                                 "\n't' = Twitter"
                                 "\n'y' = Youtube"
                                 "\n'o' = Other"
                                 "\nOr blank for next")
            snumbr = 1
            if social_media == 'i':
                iinput = input("Instagram " + str(snumbr) + ": ")
                instagram.append(iinput)

            elif social_media == 's':
                sinput = input("Snapchat " + str(snumbr) + ": ")
                instagram.append(sinput)
                snumbr += 1
    print(victim_names, victim_ages, instagram, snapchat)

# Write victims to file.
for v in range(number_of_victims):
    target.write("__Victim " + str(v + 1) + ":__\n")
    target.write("- Name: " + victim_names[v] + "\n")
    target.write("- Estimated age: " + victim_ages[v] + " years old.\n\n")
    target.write("- Instagram: " + instagram[v] + "\n")
    target.write("- Snapchat: " + snapchat[v] + "\n") 

1 个答案:

答案 0 :(得分:1)

你犯了3个错误:

  1. while的{​​{1}}循环测试。这是第一次,因为您将social_media != ""设置在顶部。但是你要求用户通过将输入留空来结束循环。您永远不会重置该设置,因此对于下一个受害者,social_media = True 仍然存在

    要么为每个受害者设置social_media = ""不同的值,要么根本不使用标记,只需在请求输入后使用social_media,使用while True:如果输入为空:

    break
  2. 您将计数器设置为1 社交媒体循环。因此,对于每个社交媒体条目,您将计数器设置为1 。将计数器设置为1 外部循环:

    while True:
        social_media = input(...)
        if not social_media:  # empty
            break
    
        # ...
    
  3. 您只需在申请Snapchat帐户时增加号码。无论您要求的帐户是什么,都需要增加数字。

  4. 你的结构可能更好;你首先测试snumbr = 1 while ...: # ask for social media # done asking, increment snumbr += 1 然后重复相同的confirm_social_media循环有点奇怪。只需遍历受害者计数,并在该循环中 ,测试for以运行或跳过社交媒体问题循环。

    您真的想重新考虑您的打印策略,因为您的代码假设每个受害者只有一个Instagram和一个Snapchat帐户。情况并非如此,您需要为每个受害者创建社交媒体帐户的列表

    您应该为每个受害者使用字典,并将字典存储在列表中。使用单个confirm_social_media列表,并在每个受害者循环中使用:

    victims

    然后遍历字典列表并打印出您收集的数据:

    victim_data = {'number': i}
    victim_data['name'] = input("Name of victim " + str(i) + ": ")
    victim_data['age'] = input("Age of victim " + str(i) + ": ")
    instagram = victim_data['instagram'] = []
    snapchat = victim_data['snapchat'] = []
    
    # collect social media in `instagram` and `snapchat`
    
    victims.append(victim_data)