[英]Converting a list into comma-separated string with “and” before the last item - 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.
有没有更简洁的方法来实现这一目标? 这应该适用于任何长度的列表。
当列表中有 1+ 项时(如果没有,则使用第一个元素):
>>> "{} and {}".format(", ".join(listy[:-1]), listy[-1])
'item1, item2, item3, item4, item5, and item6'
编辑:如果你需要一个牛津逗号(甚至不知道它存在!) - 只需使用: ", and"
istead。
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]:
def coma(lst):
return '{} and {}'.format(', '.join(lst[:-1]), lst[-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
另一种不同的做法:
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')
我不能完全相信,但如果你想要简洁——我修改了RoadieRich 的答案以使用f-strings并使它更简洁。 它使用RootTwo在对该答案的评论中给出的解决方案:
def join(items):
*start, last = items
return f"{','.join(start)}, and {last}" if start else last
在 python 中,许多与列表一起工作的函数也与迭代器一起工作(如join
、 sum
、 list
)。 获取迭代的最后一项并不是那么容易,因为你无法获取长度,因为它可能事先是未知的。
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))
在组合字符串时使用+
通常是不好的做法,因为它通常很慢。 相反,您可以使用
def comma(items):
return "{}, and {}".format(", ".join(items[:-1]), items[-1])
但是,您应该注意,如果您只有一项,这将中断:
>>> comma(["spam"])
', and spam'
为了解决这个问题,你可以测试列表的长度( if len(items) >= 2:
),或者这样做,这(恕我直言)稍微更像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 方式。
不妨用递归示例来完善解决方案。
>>> 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'
>>>
您也可以尝试quoter
库
>>> import quoter
>>> mylist = ['a', 'b', 'c']
>>> quoter.and_join(mylist)
'a, b, and c'
>>> quoter.or_join(mylist)
'a, b, or c'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.