我正在通过Al Sweigart撰写的“用Python自动化乏味的材料”一书中学习Python。我正在整理列表中的一章,并且有一个程序提示符,称为“逗号代码”:
假设您有一个这样的列表值:
spam = ['apples', 'bananas', 'tofu', 'cats']
编写一个函数,该函数以列表值作为参数,并返回一个字符串,其中所有项目均以逗号和空格分隔,并且在最后一项之前插入和。例如,将先前的垃圾邮件列表传递给该函数将返回
'apples, bananas, tofu, and cats'
。但是您的函数应该能够处理传递给它的任何列表值。 “
到目前为止,这是我的代码:
def commaCode(newList):
print(str(newList[:-1]) + 'and' + ' ' + str(newList[-1]))
return
nextlist = []
anotherlist = input('Enter a value')
while anotherlist != '':
nextlist = nextlist + list(anotherlist)
commaCode(nextlist)
我认为这应该可行,但是只要我输入某种输入,该程序就可以让我输入更多的输入,而没有任何反应。然后,我尝试退出该程序,并询问是否要我“杀死该程序”。我不确定我的代码有什么问题...我想可能是“ while”语句引起的,但是我不确定如何解决它。
答案 0 :(得分:2)
辛苦了。您的函数相当接近,但是您的while
将无限运行,因为anotherList
永远不会在循环块内更改。不过,nextlist
会继续在此循环中扩展,而用户传递到input()
的任何字符串都将分成字符。最终,该程序将耗尽内存并崩溃。
不要相信我:print
该变量应该终止循环块内的循环,并在每次通过时查看其作用(重要的调试技巧)。
有几种方法可以解决此问题。下面的方法允许用户在每次循环遍历中输入输入,如果没有,则结果break
是循环,否则将附加到用户输入的累积列表中。
def comma_code(items):
return ', '.join(items[:-1]) + ' and ' + items[-1]
items = []
while 1:
user_input = input('Enter a value: ')
if user_input == '':
break
items.append(user_input)
print(comma_code(items))
样品运行:
Enter a value: 1
Enter a value: 2
Enter a value: 3
Enter a value: 3
Enter a value: 4
Enter a value: 5
Enter a value:
1, 2, 3, 3, 4 and 5
请注意,变量名称是snake_cased
,而不是每个Python coding standard的camelCased
。
我还删除了print
函数中的commaCode
。这是side effect,通常是不可取的,因为该函数不是多功能的:它仅将内容打印到stdout,而不能提供其他功能。如果返回结果,则调用者可以选择处理该结果(打印,反转,将其放入数据库中...)。
还请注意,如果用户不输入任何内容或一项,则分别会导致崩溃或格式不正确的输出。尝试将这些极端情况作为练习!
这里是repl,用于测试代码。
答案 1 :(得分:1)
第二种方法是在程序中的预定义列表上实际使用功能。
spam = ['apples', 'bananas', 'tofu', 'cats']
otherlist = ['one', 'two', 'three', 'four', 'five']
def niceSentence(list):
for item in list[:-1]:
print(item + ", ", end='')
print("and " + list[-1])
niceSentence(spam)
niceSentence(otherlist)
答案 2 :(得分:0)
我以两种方式进行了挖掘,每种方式都包含您所使用的步骤。两者都有效,但是从不同来源获取列表输入。一个要求用户输入,就像您输入的一样。但是,它实际上并没有定义一个函数。相反,程序就是功能。 (我在第4章的中间部分以程序“ allMyCats2.py”为模型进行了建模。)
anyList = []
while True:
print('Enter an item for your list, or hit enter to stop.')
item = input()
if item == '':
break
anyList = anyList + [item]
for item in anyList[:-1]:
print(item + ",", end='')
print("and " + anyList[-1])
答案 3 :(得分:0)
这结合了两种方法:
def niceSentence(list):
for item in list[:-1]:
print(item + ", ", end='')
print("and " + list[-1]) #this defines the function that makes the comma list
anyList = []
while True:
print('Enter an item for your list, or hit enter to stop.')
item = input()
if item == '':
break
anyList = anyList + [item] #builds list from inputted strings
niceSentence(anyList) #calls function on built list
答案 4 :(得分:0)
我做了一个简短的
spam = ['apples', 'bananas', 'tofu', 'cats']
def list_funk(theliste):
for mot in theliste[:-1]: # first i work with index 0 to 3
print(mot, end=', ')
print('and ' + str(spam[-1])) # then adding what misses to complete exercise
list_funk(spam)
答案 5 :(得分:0)
这是解决逗号代码实践项目问题的最基本方法。 答案是使用从本书中获得的知识编写的,直到“列表”一章。不包含任何其他或高级概念。
userInput=[]
#Enter the number of total entries in the list
n =int(input("Enter the number of input elements: "))
for i in range(0,n):
newInput=input() #This gets the list values
userInput.append(newInput)
#Function to execute the program
def commaList(userInput):
for i in range(len(userInput)):
if i == len(userInput)-1:
print(' and '+userInput[i])
else:
print(userInput[i], end=',')
return
commaList(userInput)
示例
#Console Screen:
Enter the number of input elements: 4
Maths
Science
History
Music
#ProgramOutput:
Maths,Science,History, and Music
我希望这会有所帮助。
答案 6 :(得分:0)
我首先声明了一个垃圾邮件列表,然后定义了commaCode函数。然后,我在列表的最后一项中添加了“和”,然后使用for循环将逗号添加到列表中最后一项之前的每个项目。如果这些项目不是字符串数据类型,则将其转换。
因为我们要打印出包含所有项目的长字符串,所以我声明了一个空字符串变量stringList,并使用了for循环将所有项目附加到stringList。
最后,我打印出了stringList。
spam = ['apples', 'bananas', 'tofu', 'cats', 8, True] #our list
def commaCode(myList):
myList[-1] = 'and ' + str(myList[-1]) #converted last element to string and
#added an 'and'
for i in range(len(myList)-1): #add a comma to every element before
myList[i] = str(myList[i]) + ', '
stringList = '' #declare an empty string variable
for i in range(len(myList)): #add each element to the string list
stringList = stringList + str(myList[i])
print(stringList) #print the entire string list
commaCode(spam)
答案 7 :(得分:0)
这是我的答案。如果列表为空,则应打印“此处无内容”。包含一个项目的列表应仅打印该项目,而长度大于一个的列表应产生所需的结果。希望这是正确的,希望收到任何反馈。
spam = ['pizza','tofu','boats','hoes']
def comma_code(values):
if len(values) < 1:
print('Nothing to see here.')
elif len(values) == 1:
print(values[0])
else:
print(', '.join(values[:-1]) + ' and ' + values[-1])
comma_code(spam)
答案 8 :(得分:0)
def list_value(s):
while " " in s:
s.remove(" ")
while "" in s:
s.remove("")
return str(", ".join(s[:-1])) + " and " + str(s[-1])
if __name__ == "__main__":
spam = ["apples", "bananas", "tofu", "cats"]
spam.append("manga")
spam.append("papayas")
spam.append("")
spam.append("citrus")
spam.append(" ")
spam.append("berries")
spam.append("melons")
spam.append("")
spam.append(" ")
spam.append(20)
fruits = list_value(spam)
print(fruits)