我创建了这个函数来解析列表:
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.
有没有更简洁的方法来实现这一目标? 这适用于任何长度的列表。
答案 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中,许多使用列表的函数也适用于迭代器(如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))
答案 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'
答案 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