Python列出问题

时间:2014-03-12 13:44:53

标签: python python-3.x

所以我对编码很新,但我正在学习Python。所以我把它放在一起,但不是将uInput与'con'列表进行比较。我在这里做错了什么?

#countries.py
con = [('uk', 'united kingdom'), ('us', 'usa', 'america', 'united states of america'), ('japan')]
accepted = [ ]

while len(accepted) < 196:
    print("You have ", len(accepted), "/ 196 Countries!")
    uInput = input("Enter the country: ")
    print("")
    if uInput.lower() in con:
        if uInput.lower() in accepted:
            print("Already got that one!")
            print("")
        else:
            accepted.append(uInput.lower())
            print("Nice! Now for the next!")
            print("")
    else:
        print("Country not recognised, did you spell it right?")
        print("")
print("You got them all!")

*的被修改

所以这是我的代码现在已更新,但不检查重复项或添加它们,您可以根据需要多次输入UK。但是因为没有被添加到接受列表中,所以这些点也​​不会增加。

#countries.py
con = [('uk', 'united kingdom'), ('us', 'usa', 'america', 'united states of america'), ('japan')]
accepted = [ ]

while len(accepted) < 196:
    print("You have ", len(accepted), "/ 196 Countries!")
    uInput = input("Enter the country: ")
    print("")
    foundCon = False
    for conTuple in con:
        if uInput.lower() in conTuple:
            foundCon = True
            print("Nice! Now for the next!")
            print("")
            ...
        duplicate = False
        for c in accepted:
            if c in conTuple:
                duplicate = true
        if duplicate:
            print("You've already entered that one!")
            ...
    if not foundCon:
        print("Country not recognised, did you spell it right?")
        print("")
print("You got them all!")
...

3 个答案:

答案 0 :(得分:3)

in不是递归的;它可以在('uk', 'united kingdom')中找到con,但不能在'uk''united kingdom'中找到 - 这些都不是con的元素。

最简单(也是最好)的解决方法(仅针对此问题)是检查anycon元素的if any(uInput.lower() in c for c in con): 是否包含输入:

uInput

顺便说一句,

也会更好
  • 只需将set转换为小写一次然后再使用
  • 为每个con元素使用accepted,对set使用in - 从语义上讲,set主要用于查找内容set它(以及其他数学accepted操作),并为此目的进行了优化,但代价是不维护元素的排序
  • uk内存储(并检查)全部united kingdom个国家/地区名称;否则,我可以输入一次united kingdom,第二次输入accepted,{{1}}不会在{{1}},我会获得该国家的双倍信用。< / LI>

答案 1 :(得分:0)

当你调用input时,你返回一个字符串,这意味着uInput是一个字符串。

你的列表con是一个元组列表..所以在行:

if uInput.lower() in con:

你总是会变错,因为字符串正在与元组进行比较。它没有与每个元组中的每个元素进行比较,只是作为一个整体的元组。因此,uInput永远不会等于con的元素。

也许尝试将代码更改为以下内容:

foundCon = False
for conTuple in con:
   if uInput.lower() in conTuple:
       foundCon = True
       # perform logic for matching items 
       ...
       duplicate = False
       for c in accepted:
           if c in conTuple:
               duplicate = True
       if duplicate:
           # perform logic for duplicate items
           ... 
if not foundCon:
    # perform logic for no matches
    ...

答案 2 :(得分:0)

Karl Knechtel的主要观点是:&#39; in&#39;不会进入你的嵌套列表(你有一个列表,其中每个元素都是一个列表)。但是,如果你确实想看看元素是否真实,那就是&#39; foo&#39;存在于列表列表中&#39; blah&#39;然后:

blah=[['hi','there'],['yo','whatsup','foo']]
if('foo' in [y for y in x for x in blah]):
    print("Yep, it's in there")

基本上,你可以迅速扁平化“等等”。通过使用列表推导使其成为:

blah_flattened = ['hi','there','yo','whatsup']