如果语句没有正确分支

时间:2017-12-05 19:58:59

标签: python python-3.x

我是python的新手。该程序将任何列表传递给一个函数并打印一个字符串,其中的单词用','最后一个单词用'和'分隔。但是If语句没有为最后一个字分支。我不知道是否将它置于for循环中会破坏它。

spam = ['apples', 'oranges', 'pears', 'strawberries', 'watermelon']

def comma(x):
    newSpam = x[0]
    del x[0]
    for i in range(len(x)):
        print(type(len(x)))
        if i == (len(x)):
            newSpam = newSpam + ', and ' + [x(i)]
        else:            
            newSpam = newSpam + ', '+ x[i]
    print(newSpam)
comma(spam)

我得到的输出是:

apples, oranges, pears, strawberries, watermelon

4 个答案:

答案 0 :(得分:2)

正如您在newSpam = x[0]行中演示的那样,Python是零索引的,这意味着列表的第一项是索引0,列表的最后一项是小于索引的长度的一项。名单。因此,要检查您是否在最后一项,您需要检查if i == (len(x) - 1)而不是if i == len(x)

答案 1 :(得分:1)

if i == (len(x)):替换为

if i == (len(x) - 1):

答案 2 :(得分:0)

长度不表示列表的最后一项。您需要使用length-1来表示最后一项。

def comma(a_list):
   x=len(a_list)
   y=""
   for i in range (x):
     if i==(x-1):
        y=y+"and "
        y=y+spam[i]
        break
     y=y+spam[i]
     y=y+", "

    print (y)

答案 3 :(得分:0)

虽然其他答案包括修复代码,但是您编写的代码存在一些重大缺陷:

  1. 通过重复连接来构建字符串,O(n**2)工作(它是Schlemiel_the_Painter's_algorithm的一种形式)
  2. 您正在改变参数(删除第一个值),这对于面向输出的函数来说非常令人惊讶
  3. 我建议进行重构以避免这两个问题(并简化代码):

    def comma(x):
        *rest, last = x  # Unpacks to a new list of all the values but one, with last separated
        if rest:
            # For more than one item, join rest with commas, and explicitly
            # add separator between rest and last
            print(', '.join(rest), last, sep=', and ')
        else:
            # For one item, just print it
            print(last)
    

    作为这种转变的一个附带好处,该功能不再需要可变序列(例如list);它与(非可变)tuple或(非序列)set(虽然排序是任意的)或没有已知长度的生成器(因为*rest, last = x是一样的无论输入类型如何,都将输入转换为list和单个值。