用Python自动完成无聊的事情的“逗号代码”程序

时间:2018-08-18 04:09:39

标签: python

我正在通过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”语句引起的,但是我不确定如何解决它。

9 个答案:

答案 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 standardcamelCased

我还删除了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)