自动化无聊的东西-逗号代码:为什么我的代码不起作用?

时间:2019-01-04 08:29:45

标签: python python-3.x

我正在处理逗号代码问题,并且想出了以下代码:

def comma_code(mylist):
    for i in mylist:
         if i!=len(mylist):
              print (mylist[i]+', ',end="")
         elif i==len(mylist):
              print ('and ' + mylist[i])
spam = ['apple', 'bananas', 'tofu', 'cats']
comma_code( spam )

我遇到以下错误:

Traceback (most recent call last):
  File "/Users/vivianspro/PycharmProjects/helloworld/ATBS chapter 4 List", line 61, in <module>
    comma_code( spam )
  File "/Users/vivianspro/PycharmProjects/helloworld/ATBS chapter 4 List", line 57, in comma_code
    print (mylist[i]+', ',end="")
TypeError: list indices must be integers or slices, not str

我还通过反复试验编写了以下代码,并且神奇地起作用了,但是我不明白为什么在地球上起作用了

def comma_code(mylist):
    for i in range(0, len(mylist)-1):
        if i != len( mylist ):
        print( mylist[i] + ', ', end="" ) 
    a=len(mylist)
    while a:
          print('and ' + mylist[i+1])
          break
spam = ['apple', 'bananas', 'tofu', 'cats']
comma_code( spam )

对于while循环,为什么mylist[i+1]有效,而不是简单地mylist[i]有效?

3 个答案:

答案 0 :(得分:2)

您正在遍历列表并期望索引,同时实际获取列表的元素:

def comma_code(mylist):
    for i in mylist:

相反,如果您确实需要索引,则可以使用enumerate

def comma_code(mylist):
    for i, item in enumerate(mylist):

但是不需要像这样直接处理索引。怎么样:

def comma_code(mylist):
    for item in mylist[:-1]:
        print(item + ', ', end="")
    print('and', mylist[-1])

spam = ['apple', 'bananas', 'tofu', 'cats']
comma_code(spam)

这还不能处理一个空列表的情况(对于只有一个元素的列表,它的输出很奇怪),但是我会把它留给读者阅读。

答案 1 :(得分:1)

在循环for i in mylist:中,i依次接受每个列表元素的值,而不是元素的索引。此时表达式mylist[i]显然是不正确的,因为该元素已经是i。出于相同的原因,比较i==len(mylist)毫无意义。

由于for i in range(0, len(mylist)-1):排除了最后一个元素,因此循环len(mylist)-2从0迭代到range。这意味着当循环结束时,i == len(mylist)-2是倒数第二个元素的索引。

随后的while循环根本不是一个循环。它在print('and ' + mylist[i+1])之后的第一次迭代中爆发。打印列表的最后一个元素很麻烦。请记住,此时ifor循环结束之后的倒数第二个索引,因此i + 1只是最后一个元素的索引。

所有这些代码都可以简化为一个衬里:

print(*mylist[:-1], 'and ' + mylist[-1], sep=', ')

print(f'{", ".join(mylist[:-1])}, and {mylist[-1]}')

答案 2 :(得分:0)

spam = ['apples', 'bananas', 'tofu', 'cats']


def commacode(list):
    lastitem = ''.join(spam[-1:])
    return ', '.join(spam[:-1]) + ' and ' + lastitem


print(commacode(spam))