使用Python自动化无聊的东西:逗号代码

时间:2016-08-08 08:37:42

标签: python

目前正在通过这本初学者书籍,并完成了一个练习项目'逗号代码'要求用户构建一个程序:

  

将列表值作为参数并返回   一个字符串,其中所有项目用逗号和空格分隔,用和   在最后一项之前插入。例如,将下方垃圾邮件列表传递给   该功能将返回苹果,香蕉,豆腐和猫等。但是你的功能   应该能够处理传递给它的任何列表值。

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

我对问题的解决方案(效果非常好):

spam= ['apples', 'bananas', 'tofu', 'cats']
def list_thing(list):
    new_string = ''
    for i in list:
        new_string = new_string + str(i)
        if list.index(i) == (len(list)-2):
            new_string = new_string + ', and '
        elif list.index(i) == (len(list)-1):
            new_string = new_string
        else:
            new_string = new_string + ', '
    return new_string

print (list_thing(spam))

我唯一的问题是,有什么方法可以缩短我的代码吗?或者让它更多' pythonic'?

这是我的代码。

def listTostring(someList):
    a = ''
    for i in range(len(someList)-1):
        a += str(someList[i])
    a += str('and ' + someList[len(someList)-1])
    print (a)

spam = ['apples', 'bananas', 'tofu', 'cats']
listTostring(spam)

输出:苹果,香蕉,豆腐和猫

29 个答案:

答案 0 :(得分:10)

使用str.join()加入带分隔符的字符串序列。如果对最后一个之外的所有单词执行此操作,则可以在其中插入' and '

def list_thing(words):
    if len(words) == 1:
        return words[0]
    return '{}, and {}'.format(', '.join(words[:-1]), words[-1])

打破这个局面:

  • words[-1]获取列表的最后一个元素。 words[:-1] 切片列表以生成一个新列表,其中包含最后一个单词之外的所有单词。

  • ', '.join()生成一个新字符串,str.join()的所有参数字符串都与', '结合。如果输入列表中只有一个元素,则返回一个元素,取消连接。

  • '{}, and {}'.format()将逗号连接的单词和最后一个单词插入模板(以牛津逗号填写)。

如果您传入一个空列表,则上述函数将引发IndexError异常;如果您认为空列表是函数的有效用例,则可以在函数中专门测试该情况。

因此,上面的除了最后一个以及', '之外的所有单词,然后使用' and '将最后一个单词添加到结果中。

请注意,如果只有一个单词,则会得到一个单词;在这种情况下没有什么可以加入的。如果有两个,则获得'word1 and word 2'。更多的单词会产生'word1, word2, ... and lastword'

演示:

>>> def list_thing(words):
...     if len(words) == 1:
...         return words[0]
...     return '{}, and {}'.format(', '.join(words[:-1]), words[-1])
...
>>> spam = ['apples', 'bananas', 'tofu', 'cats']
>>> list_thing(spam[:1])
'apples'
>>> list_thing(spam[:2])
'apples, and bananas'
>>> list_thing(spam[:3])
'apples, bananas, and tofu'
>>> list_thing(spam)
'apples, bananas, tofu, and cats'

答案 1 :(得分:4)

我试过这个,希望这就是你要找的东西: -

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

def list_thing(list):

#creating a string then splitting it as list with two items, second being last word
    new_string=', '.join(list).rsplit(',', 1)    

#Using the same method used above to recreate string by replacing the separator.

    new_string=' and'.join(new_string)
    return new_string

print(list_thing(spam))

答案 2 :(得分:4)

这是一个正确处理Oxford comma的解决方案。它还处理一个空列表,在这种情况下它返回一个空字符串。

def list_thing(seq):
    return (' and '.join(seq) if len(seq) <= 2
        else '{}, and {}'.format(', '.join(seq[:-1]), seq[-1]))

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

for i in range(1 + len(spam)):
    seq = spam[:i]
    s = list_thing(seq)
    print(i, seq, repr(s))

<强>输出

0 [] ''
1 ['apples'] 'apples'
2 ['apples', 'bananas'] 'apples and bananas'
3 ['apples', 'bananas', 'tofu'] 'apples, bananas, and tofu'
4 ['apples', 'bananas', 'tofu', 'cats'] 'apples, bananas, tofu, and cats'

答案 3 :(得分:4)

我使用了不同的方法。我是初学者,所以我不知道这是否是最干净的方式。对我来说,它似乎是最简单的方式:

spam = ['apples', 'pizza', 'dogs', 'cats']

def comma(items):
    for i in range(len(items) -2):
        print(items[i], end=", ")# minor adjustment from one beginner to another: to make it cleaner, simply move the ', ' to equal 'end'. the print statement should finish like this --> end=', '
    print(items[-2] + 'and ' + items[-1]) 

comma(spam)

这将给出输出:

apples, pizza, dogs and cats

答案 4 :(得分:2)

其他人提供了很好的单线解决方案,但是改善实际实现的一个好方法 - 并且修复了在重复元素时它不起作用的事实 - 是在for循环中使用enumerate来保持跟踪索引,而不是使用始终查找目标的第一个出现的index

for counter, element in enumerate(list):
    new_string = new_string + str(element)
    if counter == (len(list)-2):
        ...

答案 5 :(得分:2)

我对这个问题的解释是,单个列表项也是最后一个列表项,因此需要&#39;和&#39;在它之前插入,以及两个项目列表同时返回&#39; import FirebaseStorage&#39;它们之间。因此,不需要单独处理单个或两个项目列表,只需要处理前n个项目和最后一个项目。 我还注意到,虽然很棒,很多其他项目使用的模块和功能在学生遇到这个问题时自动化无聊的东西文本中没有教过(像我这样的学生看过, andjoin在其他地方,但试图只使用文中所教的内容。)

.format

你可以通过以下方式处理空列表案例:

def commacode(passedlist):
    stringy = ''
    for i in range(len(passedlist)-1):
        stringy += str(passedlist[i]) + ', '
        # adds all except last item to str
    stringy += 'and ' + str(passedlist[len(passedlist)-1])
    # adds last item to string, after 'and'
    return stringy

答案 6 :(得分:2)

格式声明更清晰。

这对我也很有用:

def sentence(x):
    if len(x) == 1:
        return x[0]
    return (', '.join(x[:-1])+ ' and ' + x[-1])

答案 7 :(得分:1)

def sample(values):
    if len(values) == 0:
         print("Enter some value")
    elif len(values) == 1:
        return values[0]
    else:
        return ', '.join(values[:-1] + ['and ' + values[-1]])

spam = ['apples', 'bananas', 'tofu', 'cats']
print(sample(spam))

答案 8 :(得分:1)

由于该函数必须适用于传递给它的所有列表值,包括整数,因此它应该能够返回/打印所有值,即str()。我完全正常工作的代码如下所示:

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

def commacode(words):

    x = len(words)

    if x == 1:
        print(str(words[0]))
    else:
        for i in range(x - 1):
            print((str(words[i]) + ','), end=' ')
        print(('and ' + str(words[-1])))

commacode(spam)

答案 9 :(得分:1)

我正在研究同一本书,并提出了以下解决方案: 这样,用户就可以输入一些值并根据输入内容创建列表。

userinput = input('Enter list items separated by a space.\n')
userlist = userinput.split()

def mylist(somelist):
    for i in range(len(somelist)-2): # Loop through the list up until the second from last element and add a comma
        print(somelist[i] + ', ', end='')
    print(somelist[-2] + ' and ' + somelist[-1]) # Add the last two elements of the list with 'and' in-between them

mylist(userlist)

示例:

用户输入:一二三四有五 输出:1、2、3、4和5

答案 10 :(得分:1)

这是我想出的。可能有一种更简洁的编写方法,但是只要列表中至少有一个元素,它就可以与任何大小的列表一起使用。

spam = ['apples', 'oranges' 'tofu', 'cats']
def CommaCode(list):
    if len(list) > 1 and len(list) != 0:
        for item in range(len(list) - 1):
            print(list[item], end=", ")
        print('and ' + list[-1])
    elif len(list) == 1:
        for item in list:
            print(item)
    else:
        print('List must contain more than one element')
CommaCode(spam)

答案 11 :(得分:0)

首先,我只有两个月的时间在做 Python 和编码。

这花了 2 小时以上来解决,因为我将空列表变量设置为 lst = [],而不是使用 lst = "" ......不确定为什么。


        user_input = input().split()
        lst = "" # I had this as lst = [] but doesn't work I don't know why.... yet
        for chars in user_input:
            if chars == user_input[0]:
                lst += user_input[0]
            elif chars  == user_input[-1]:
                lst += ", and " + chars
            else:
                lst += ", " + chars
    
         print(lst)

 

编辑:更多细节

.split() 函数会将我们的用户输入(字符串值)放入一个列表中。这为我们提供了索引,我们可以使用我们的 for 循环。 lst 空字符串变量仍在进行中。接下来,在我们的 for 循环中查看每个索引,如果该索引与我们的布尔值匹配,我们将我们想要的内容添加到我们的列表中。在这种情况下,要么什么都没有,要么,和,或者最后只是另一个 strong>(逗号)。然后打印。

也就是说,大多数答案都包含 .join 方法,但在本书的这一部分并未讨论这一点。 这是第 6 章

基本上就像我教你加减法然后给你一个分数测试。我们还没有准备好,只是造成了混乱,至少对我来说是这样。更不用说甚至没有人提供有关它的文档。 .join() 方法 如果有人需要,可以在此处查看文档和示例的一些区域:

#PayItForward

答案 12 :(得分:0)

def listall(lst):               # everything "returned" is class string
    if not lst:                 # equates to if not True. Empty container is always False
        return 'NONE'           # empty list returns string - NONE
    elif len(lst) < 2:          # single value lists
        return str(lst[0])      # return passed value as a string (do it as the element so 
                                #  as not to return [])
    return (', '.join(str(i) for i in lst[:-1])) + ' and ' + str(lst[-1])
        # joins all elements in list sent, up to last element, with (comma, space) 
        # AND coverts all elements to string. 
        # Then inserts "and". lastly adds final element of list as a string.

这并非旨在回答原始问题。这是为了展示如何定义功能来解决本书所要求的所有问题,而又不会太复杂。我认为这是可以接受的,因为最初的问题发布了“ Comma Code”测试书。 重要提示 我发现可能对其他人有所帮助的一些困惑。 “列表值”表示类型列表或“整个列表”的值,并不表示“类型列表”中的单个值(或切片)。 希望对您有所帮助

这是我用来测试的示例:

empty = []
ugh = listall(empty)
print(type(ugh))
print(ugh)
test = ['rabbits', 'dogs', 3, 'squirrels', 'numbers', 3]
ughtest = listall(test)
print(type(ughtest))
print(ughtest)
supertest = [['ra', 'zues', 'ares'],
            ['rabbit'],
            ['Who said', 'biscuits', 3, 'or', 16.71]]
one = listall(supertest[0])
print(type(one))
print(one)
two = listall(supertest[1])
print(type(two))
print(two)
last = listall(supertest[2])
print(type(last))
print(last)

答案 13 :(得分:0)

listA = [ 'apples', 'bananas', 'tofu' ]
def commaCode(listA):
    s = ''
    for items in listA:
        if items == listA [0]:
            s = listA[0]
        elif items == listA[-1]:
            s += ', and ' + items
        else:
            s += ', ' + items
    return s
print(commaCode(listA))

答案 14 :(得分:0)

无论列表中的数据类型是boolean,int,string,float等还是什么,此代码都有效。

def commaCode(spam):
    count = 0
    max_count = len(spam) - 1

    for x in range(len(spam)):
        if count < max_count:
            print(str(spam[count]) + ', ', end='')
            count += 1
        else:
            print('and ' + str(spam[max_count]))

spam1 = ['cat', 'bananas', 'tofu', 'cats']
spam2 = [23, '', True, 'cats']
spam3 = []

commaCode(spam1)
commaCode(spam2)
commaCode(spam3)

答案 15 :(得分:0)

我没有仔细研究所有答案,但确实看到有人建议使用Join。我同意,但是既然这个问题在学习加入之前就没有出现在书中,所以我的答案就是这个。

def To_String(my_list)
    try:
        for index, item in enumerate(my_list):
            if index == 0:                       # at first index
                myStr = str(item) + ', '
            elif index < len(my_list) - 1:       # after first index
                myStr += str(item) + ', '
            else:
                myStr += 'and ' + str(item)      # at last index
        return myStr  

    except NameError:
        return 'Your list has no data!'

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

my_string = To_String(spam)

print(my_string)

结果:

apples, bananas, tofu, and cats

答案 16 :(得分:0)

没有循环,没有联接,只有两个打印语句:

def commalist(listname):
    print(*listname[:-1], sep = ', ',end=", "),
    print('and',listname[-1])

答案 17 :(得分:0)

我对任何解决方案都不满意,因为没有人用or处理案件,例如apples, bananas, or berries

def oxford_comma(words, conjunction='and'):
    conjunction = ' ' + conjunction + ' '

    if len(words) <= 2:
        return conjunction.join(words)
    else:
        return '%s,%s%s' % (', '.join(words[:-1]), conjunction, words[-1])

否则,该解决方案与@ PM2Ring提供的解决方案大致相同

答案 18 :(得分:0)

我想出了这个解决方案

#This is the list which needs to be converted to String
spam = ['apples', 'bananas', 'tofu', 'cats']

#This is the empty string in which we will append
s = ""


def list_to_string():
    global spam,s
    for x in range(len(spam)):
        if s == "":
            s += str(spam[x])
        elif x == (len(spam)-1):
            s += " and " + str(spam[x])
        else:
            s += ", " + str(spam[x])
    return s

a = list_to_string()
print(a)

答案 19 :(得分:0)

只是一个简单的代码。我认为我们不需要在这里使用任何花哨的东西。 :p

def getList(list):
    value = ''
    for i in range(len(list)):
        if i == len(list) - 1:
            value += 'and '+list[i]
        else:
            value += list[i] + ', '
    return value

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

print('### TEST ###')
print(getList(spam))

答案 20 :(得分:0)

我是一个相当新的pythonista。在问题中,有人要求该函数将列表内容作为字符串返回,其格式为该论坛中的其他解决方案已“打印”它。以下是(在我看来)这个问题的更清洁的解决方案。

这说明了Automate The Boring Stuff中第4章[Lists]的逗号代码解决方案。

def comma_code(argument):

    argument_in_string = ''
    argument_len = len(argument)
    for i in range(argument_len):
        if i == (argument_len - 1):
            argument_in_string = argument_in_string + 'and ' + argument[i]
            return argument_in_string

        argument_in_string = argument_in_string + argument[i] + ', '

spam = ['apples', 'bananas', 'tofu', 'cats']
return_value = comma_code(spam)
print(return_value)"

答案 21 :(得分:0)

那个人为了简单而获胜Hein。

仅作者指出:

  

“您的函数应该能够处理传递给它的任何列表值。”

要伴随非字符串,请在[i]函数中添加str()标记。

spam = ['apples', 'bananas', 'tofu', 'cats', 'bears', 21] def pList(x): for i in range(len(x) - 2): print(str(x[i]) + ', ', end='') print(str(x[-2]) + ' and ' + str(x[-1])) pList(spam)

答案 22 :(得分:-1)

这是我的解决方案。一旦我找到了连接方法及其工作方式,其余的就跟着了。

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

def commas(h):
    s = ', '
    print(s.join(spam[0:len(spam)-1]) + s + 'and ' + spam[len(spam)-1])

commas(spam)

答案 23 :(得分:-1)

spam=['apples','bananas','tofu','cats']
print("'",end="")
def val(some_parameter):

for i in range(0,len(spam)):
if i!=(len(spam)-1):
print(spam[i]+', ',end="")
else:
print('and '+spam[-1]+"'")
val(spam)

答案 24 :(得分:-1)

def commacode(mylist):
    mylist[-1] = 'and ' + mylist[-1]
    mystring = ', '.join(mylist)
    return mystring

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

print commacode(spam)

答案 25 :(得分:-1)

为什么每个人都会提出如此复杂的代码。

请参阅下面的代码。即使对于初学者来说,它也是最简单易懂的。

import random

def comma_code(subject):

     a = (len(list(subject)) - 1)

     for i in range(0, len(list(subject))):

          if i != a:
               print(str(subject[i]) + ', ', end="")

          else:
              print('and '+ str(subject[i]))            


spam = ['apples','banana','tofu','cats']
编写完上面的代码后,只需在python shell中键入comma_code(spam)就可以了。享受

答案 26 :(得分:-1)

这就是我所做的,IMO更直观......

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

def ipso(x):
    print("'" , end="")
    def run (x):

    for i in range(len(x)):
        print(x[i]+ "" , end=',')


    run(x)
    print("'")

ipso(spam)

答案 27 :(得分:-2)

spam=['apple', 'banana', 'tofu','cats']
spam[-1]= 'and'+' '+ spam[-1]
print (', '.join((spam)))

答案 28 :(得分:-3)

我是python的新手,可能还有其他更简单的解决方案,但这里是我的

    spam = ["cats","dogs","cows","apes"]
    def commaCode(list):
        list[-1] =  "and " + list[-1]
        print(", ".join(list))


    commaCode(spam)