我是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
答案 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)
虽然其他答案包括修复代码,但是您编写的代码存在一些重大缺陷:
O(n**2)
工作(它是Schlemiel_the_Painter's_algorithm的一种形式)我建议进行重构以避免这两个问题(并简化代码):
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
和单个值。