使用"和"将列表转换为逗号分隔的字符串在最后一项之前 - Python 2.7

时间:2016-08-16 17:44:46

标签: python python-2.7

我创建了这个函数来解析列表:

listy = ['item1', 'item2','item3','item4','item5', 'item6']


def coma(abc):
    for i in abc[0:-1]:
        print i+',',
    print "and " + abc[-1] + '.'

coma(listy)

#item1, item2, item3, item4, item5, and item6.

有没有更简洁的方法来实现这一目标? 这适用于任何长度的列表。

10 个答案:

答案 0 :(得分:15)

当列表中有1个以上的项目时(如果没有,只需使用第一个元素):

>>> "{} and {}".format(", ".join(listy[:-1]),  listy[-1])
'item1, item2, item3, item4, item5, and item6'

编辑:如果你需要牛津逗号(不知道它甚至存在!) - 只需使用:", and" isntead。

答案 1 :(得分:5)

def oxford_comma_join(l):
    if not l:
        return ""
    elif len(l) == 1:
        return l[0]
    else:
        return ', '.join(l[:-1]) + ", and " + l[-1]

print(oxford_comma_join(['item1', 'item2', 'item3', 'item4', 'item5', 'item6']))

<强>输出:

item1, item2, item3, item4, item5, and item6

另外,除了Pythonic的写作方式

for i in abc[0:-1]:

for i in abc[:-1]:

答案 2 :(得分:3)

def coma(lst):
    return '{} and {}'.format(', '.join(lst[:-1]), lst[-1])

答案 3 :(得分:2)

另一种不同的方式:

listy = ['item1', 'item2','item3','item4','item5', 'item6']

第一种方式

print(', '.join('and, ' + listy[item] if item == len(listy)-1 else listy[item]
for item in xrange(len(listy))))

output >>> item1, item2, item3, item4, item5, and, item6

第二种方式

print(', '.join(item for item in listy[:-1]), 'and', listy[-1])

output >>> (item1, item2, item3, item4, item5, 'and', 'item6')

答案 4 :(得分:1)

在python中,许多使用列表的函数也适用于迭代器(如joinsumlist)。获取迭代的最后一项并不容易,因为你无法获得长度,因为它可能事先未知。

def coma_iter(iterable):
    sep = ''
    last = None
    for next in iterable:
        if last is not None:
            yield sep
            yield last
            sep = ', '
        last = next
    if sep:
        yield ', and '
    if last is not None:
        yield last

print ''.join(coma_iter(listy))

答案 5 :(得分:1)

在组合字符串时使用+通常是不好的做法,因为它通常很慢。相反,您可以使用

def comma(items):
    return "{}, and {}".format(", ".join(items[:-1]), items[-1])

但是,您应该注意,如果您只有一个项目,这将会中断:

>>> comma(["spam"])
', and spam'

要解决这个问题,您可以测试列表的长度(if len(items) >= 2:),或者执行此操作,其中(imho)稍微更加pythonic:

def comma(items):
    start, last = items[:-1], items[-1]

    if start:
        return "{}, and {}".format(", ".join(start), last)
    else:
        return last

如上所述,单个项目列表将导致items[:-1]的空值。 if last:只是检查last是否为空的pythonic方式。

答案 6 :(得分:1)

也可以通过递归示例完善解决方案。

>>> listy = ['item1', 'item2','item3','item4','item5', 'item6']
>>> def foo(a):
    if len(a) == 1:
        return ', and ' + a[0]
    return a[0] + ', ' + foo(a[1:])

>>> foo(listy)
'item1, item2, item3, item4, item5, , and item6'
>>> 

答案 7 :(得分:1)

更正了Craig回答的包含2个元素的列表(不允许发表评论):

def oxford_comma_join(l):
    if not l:
        return ""
    elif len(l) == 1:
        return l[0]
    elif len(l) == 2:
        return l[0] + " and " + l[1]
    else:
        return ', '.join(l[:-1]) + ", and " + l[-1]

print(oxford_comma_join(['item1', 'item2', 'item3', 'item4', 'item5', 'item6']))

print(oxford_comma_join(['i1', 'i2']))

结果:

item1, item2, item3, item4, item5, and item6
i1 and i2

答案 8 :(得分:0)

您还可以尝试quoter

>>> import quoter
>>> mylist = ['a', 'b', 'c']
>>> quoter.and_join(mylist)
'a, b, and c'
>>> quoter.or_join(mylist)
'a, b, or c'

https://pypi.python.org/pypi/quoter

答案 9 :(得分:0)

我不能完全相信,但是如果您想简洁地说,我将RoadieRich's answer修改为使用f-strings,并且使其更加简洁。它在RootTwo given in a comment上使用that answer的解决方案:

def join(items):
    *start, last = items
    return f"{','.join(start)}, and {last}" if start else last