您如何以更英语的形式(例如“ a,b和c”)输出列表?

时间:2019-09-25 01:08:21

标签: python python-3.x

我创建了一个列表,但是在打印时,我需要在列表中的最后一项之前添加“ and”。示例:

mylist = ['me', 'you', 'him', 'her']

当我打印出列表时,我希望它看起来像这样:

me, you, him and her.

我不希望显示'[]

我当前正在使用:

mylist = ['me', 'you', 'him', 'her']
print (','.join.(mylist))

,但输出为me,you,him,her。我需要显示me, you, him and her

6 个答案:

答案 0 :(得分:2)

str.join两次使用rsplit

mylist = ['me', 'you', 'him', 'her']

new_str = ' and '.join(', '.join(mylist).rsplit(', ', 1))
print(new_str)

输出:

me, you, him and her

这适用于空列表或单元素列表:

new_str = ' and '.join(', '.join([]).rsplit(', ', 1))
print(new_str)
# None

new_str = ' and '.join(', '.join(['me']).rsplit(', ', 1))
print(new_str)
# me

答案 1 :(得分:2)

我是明确性的忠实拥护者,所以我可以这样写:

def human_list(items):
    # Empty list? Empty string.
    if not items:
        return ''

    # One-item list? Return that item.
    if len(items) == 1:
        return items[0]

    # For everything else, join all items *before* the last one with commas,
    # then add ' and {last_item}' to the end.
    return ', '.join(items[:-1]) + ' and ' + items[-1]

# Demonstrate that this works the way we want
assert human_list([]) == ''
assert human_list(['spam']) == 'spam'
assert human_list(['spam', 'eggs']) == 'spam and eggs'
assert human_list(['one', 'two', 'three']) == 'one, two and three'
assert human_list(['knife', 'fork', 'bottle', 'a cork']) == 'knife, fork, bottle and a cork'

答案 2 :(得分:1)

您可以执行以下操作:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <button type="submit">Submit</button>
</form>

答案 3 :(得分:0)

助手功能可能是一个好方法,因为它可以集中控制,这意味着您可以修复错误或轻松进行改进(例如处理空列表之类的极端情况)。由于它只包含类似readableList(myList)之类的内容,因此它也使主代码更易于阅读。

以下功能是您所需要的:

def readableList(pList):
    if len(pList) == 0: return ""
    if len(pList) == 1: return pList[0]
    return ", ".join(pList[:-1]) + ' and ' + pList[-1]

对于测试工具,您可以使用类似以下内容的东西:

for myList in [['me', 'you', 'him', 'her'], ['one', 'two'], ['one'], []]:
    print("{} -> '{}'".format(myList, readableList(myList)))

给出输出:

['me', 'you', 'him', 'her'] -> 'me, you, him and her'
['one', 'two'] -> 'one and two'
['one'] -> 'one'
[] -> ''

请注意,->右侧的那些引号是由我的测试工具添加的,以便您可以看到字符串是什么(没有尾随空格,显示空字符串等)。根据您的要求,它们不是来自readableList函数本身。

答案 4 :(得分:0)

如果您不想进行切片等操作,下面是一个简单的方法。它可以让您重用已实现的功能(函数调用),还可以轻松更改内部逻辑。

  

注意:如果列表为空,将返回一个空白字符串

def get_string(l):
    s = ""
    index = 0
    length = len(l)

    while index < length:
        word = l[index]

        if index == length - 1:
            s += 'and ' + word
        else:
            s += word + ", "

        index += 1

    return s.strip()


# Try
mylist = ['me', 'you', 'him', 'her']
print(get_string(mylist)) # me, you, him, and her

答案 5 :(得分:-1)

要在最后一个元素之前添加元素,您可以这样做

last_element = mylist.pop()
mylist.append(' and ')
mylist.append(last_element)
my_string = ', 'join(mylist[:-2]) + mylist[-2] + mylist[-1]
print(my_string)

mylist.insert(-1, ' and ')
my_string = ', 'join(mylist[:-2]) + mylist[-2] + mylist[-1]
print(my_string)

但是LoMaPh在评论中给出的一个更好的答案是:

', '.join(mylist[:-1]) + ' and ' + mylist[-1]