将列表转换为以逗号分隔的字符串,并使用;及;在最后一项之前-Python 2.7

将列表转换为以逗号分隔的字符串,并使用;及;在最后一项之前-Python 2.7,python,python-2.7,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. 有没有更整洁的方法来实现这一点? 这应

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

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.
有没有更整洁的方法来实现这一点?
这应该适用于任何长度的列表。

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


编辑:如果您需要牛津逗号(甚至不知道它存在!)——只需使用:
”和“
isntead.

在python中,许多与列表相关的函数也与迭代器相关(如
join
sum
list
)。获取iterable的最后一项并不是那么容易,因为您无法获取长度,因为它可能事先未知

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))
输出:

item1, item2, item3, item4, item5, and item6
也作为一种旁白,用蟒蛇式的方式写作

for i in abc[0:-1]:


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

def comma(items):
    return "{}, and {}".format(", ".join(items[:-1]), items[-1])
但是,您应该注意,如果您只有一个项目,则会中断:

>>> comma(["spam"])
', and spam'
为了解决这个问题,您可以测试列表的长度(
如果len(items)>=2:
),或者这样做,这(imho)稍微有点像python:

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

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

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

不妨用一个递归示例来完善解决方案

>>> 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'
>>> 

还有一种不同的方法:

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')
第二种方式

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')

您也可以尝试使用
quoter

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

对克雷格上述关于两要素清单的回答的更正(我不允许发表评论):

结果:

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

我不能完全相信你,但如果你想简洁的话——我修改了使用,也使它更简洁。它通过以下方式使用解决方案:

def连接(项目):
*开始,最后=项目
如果start else last,则返回f“{','.join(start)}和{last}”

注意:OP的示例使用。此解决方案仅适用于列表,不处理空列表或一个元素列表的情况,并使用
+
连接字符串,这是不鼓励的,应替换为
。format
@Daniel:不要反对。我回答的重点纯粹是
join(…)
和切片。OP应该能够自己处理空列表、单项目列表(正如我在回答中所说的)和
.format(..)
。@SerialDownvoter:你能对你投否决票的帖子做出回应吗?这是一个完全正确的答案。这是我见过的最难看的python代码行。@wim同意,这相当糟糕。我希望这不被认为是python:)我(和@wim)上面的评论适用于@Daniel的原始答案,他用上面列出的完全不同的、新颖的方法替换了这个答案。这不应该被否决。这很清楚,而且是唯一真正满足OP+1要求的答案。对于Python 3,您可以使用
*start,last=items
这是有史以来最常用的Javascript答案。3行代码可以完成此操作,您可以添加一个库?如果不是项:返回“”
>>> import quoter
>>> mylist = ['a', 'b', 'c']
>>> quoter.and_join(mylist)
'a, b, and c'
>>> quoter.or_join(mylist)
'a, b, or c'
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