我正在处理逗号代码问题,并且想出了以下代码:
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]
有效?
答案 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])
之后的第一次迭代中爆发。打印列表的最后一个元素很麻烦。请记住,此时i
是for
循环结束之后的倒数第二个索引,因此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))