【问题标题】:writing error when nothing returned from tuple within list当列表中的元组没有返回任何内容时写入错误
【发布时间】:2018-12-15 11:28:31
【问题描述】:
tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]
x = input(str("colour? "))
for c in tup_list:
    if x in c:
        print(c[0])
    else:
        print("error ")

代码示例^

如果用户输入“红色”,则输出为:

111
error
error
444

如果用户输入“蓝色”,则输出为:

error
222
error
error

等等。如果用户输入不在 tup_list 中的“randomchars”(任何随机字符),则输出为:

error
error
error
error

我知道我的代码正在为 tup_list 中的每个 c 打印“错误”。如果用户输入不在 tup_list 中,我希望我的代码一次写入“错误”。我也不明白为什么 tup_list 中的每个否定匹配都会打印错误(例如,输入红色会正确地得到 111 和 444,但它也会为蓝色和黄色元组提供两个错误)。

【问题讨论】:

  • 这是预期的:如果匹配,则打印,否则打印错误...您是否考虑过使用字典,其中颜色名称作为键,数字作为值(作为列表,因此可以关联超过 1 个到 1 种颜色)?它会避免循环。

标签: python list for-loop tuples nested-lists


【解决方案1】:

代码正在为tup_list 中的每个c 打印'error',它不匹配,因为您正在迭代tup_list 中的每个c。在每次迭代中,您都在检查颜色是否匹配,并且在每次迭代中,您打印它是否匹配(代码号)或不匹配('error')。你可以有一个布尔变量来验证它是否匹配:

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]
x = input('colour? ')

match = False
for c in tup_list:
    if x in c:
        print(c[0])
        match = True

if not match:
    print('error')

【讨论】:

  • 谢谢!所有其他解决方案也都有效,但这个是最简单的。
【解决方案2】:

这里我们先收集匹配项的列表,然后打印出来或者报错。

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]
x = input("colour? ")
matches = [c for c in tup_list if x in c]
if matches:
    print('\n'.join(m[0] for m in matches))
else:
    print("error")

(我也把str("colour? ")换成了"colour? ":已经是字符串了,不用强制转换了)

【讨论】:

  • 如果列表matches 仅由数字代码组成,则代码可以改进,因此[c[1] for c in tup_list if x in c]。这样,您就不需要循环 if matches - print('\n'.join(matches))
  • @YanOrestes 你是对的。但我以稍微不同的方式重写了我的代码,以展示一种不同的方法。
【解决方案3】:

由于您在 for 循环中有一个 if/else 语句,它要么找到颜色匹配,要么打印错误。如果你想打印所有匹配并且只打印一次error,你需要一个稍微不同的分支结构。

我会推荐:

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]

matches = []

x = input(str("colour? "))
for c in tup_list:
    if x in c:
        matches.append(c[0])

if matches:
    print("\n".join(map(str, matches)))
else:
     print("error")

请注意,我必须将每个匹配项从 int 映射到 str,因为 join() 需要一个字符串列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2020-06-27
    • 2021-10-05
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多