用逗号连接单词,和“和”

时间:2017-06-15 18:28:31

标签: python list

我正在研究'Automate the Boring Stuff with Python'。我无法弄清楚如何从下面的程序中删除最终输出逗号。目标是不断提示用户输入值,然后在列表中打印出来,并在结束前插入“和”。输出应该如下所示:

apples, bananas, tofu, and cats
我的样子如下:

apples, bananas, tofu, and cats,

最后一个逗号正在推动我努力。

def lister():
    listed = []
    while True:
        print('type what you want to be listed or type nothing to exit')
        inputted = input()
        if inputted == '':
            break
        else:
            listed.append(inputted+',')
    listed.insert(-1, 'and')
    for i in listed:
        print(i, end=' ')
lister()

6 个答案:

答案 0 :(得分:42)

您可以通过将格式推迟到打印时间来避免向列表中的每个字符串添加逗号。加入除getView()上的最后一项之外的所有项目,然后使用格式将已加入的字符串插入', '合并的最后一项:

and

演示:

listed.append(inputed)
...
print('{}, and {}'.format(', '.join(listed[:-1]), listed[-1]))

答案 1 :(得分:9)

接受的答案很好,但最好将此功能移动到一个单独的函数中,该函数接受一个列表,并处理列表中0,1或2项的边缘情况:

def oxfordcomma(listed):
    if len(listed) == 0:
        return ''
    if len(listed) == 1:
        return listed[0]
    if len(listed) == 2:
        return listed[0] + ' and ' + listed[1]
    return ', '.join(listed[:-1]) + ', and ' + listed[-1]

测试用例:

>>> oxfordcomma([])
''
>>> oxfordcomma(['apples'])
'apples'
>>> oxfordcomma(['apples', 'pears'])
'apples and pears'
>>> oxfordcomma(['apples', 'pears', 'grapes'])
'apples, pears, and grapes'

答案 2 :(得分:4)

稍微修改一下代码......

def lister():
    listed = []
    while True:
        print('type what you want to be listed or type nothing to exit')
        inputted = input()
        if inputted == '':
            break
        else:
            listed.append(inputted) # removed the comma here

    print(', '.join(listed[:-2]) + ' and ' + listed[-1])  #using the join operator, and appending and xxx at the end
lister()

答案 3 :(得分:3)

listed[-1] = listed[-1][:-1]

这会截断listed中最后一个字符串的最后一个字符。

答案 4 :(得分:2)

有很多方法可以做到,但是这个怎么样?

# listed[-1] is the last element of the list
# rstrip removes matching characters from the end of the string
listed[-1] = listed[-1].rstrip(',')
listed.insert(-1, 'and')
for i in listed:
    print(i, end=' ')

你仍然会在行尾打印一个空格,但我想你不会看到它并因此无法照顾。 : - )

答案 5 :(得分:0)

为完全正确且很好,我会使用f字符串(a formatted string literal,Python 3.6+)来实现。而且我会放弃牛津逗号,这样您就不必为len(word) == 2添加多余的边沿大小写了:

def grammatically_join(words):
    if len(words) == 0:
        return ""
    if len(words) == 1:
        return listed[0]
    return f'{", ".join(words[:-1])} and {words[-1]}'

您也可以只用一行来完成它:

", and ".join(", ".join(words).rsplit(", ", 1))

但这是不可读的。它首先", ".join(words)整个列表,然后在最后一次出现的", "上分割结果字符串,并用" and "将两个元素列表连接起来。如果列表中的最后一个字符串可以包含逗号和空格,则此代码将中断。但这可以处理listed仅包含一项或多项的情况,这与当前的最佳答案不同。