例如,我有一个字符串列表:
str_list =['one', 'two', 'three', 'four', 'five']
我想在屏幕上打印所有这些:
for c in str_list:
print c
print ', ' # word separator
导致:
one, two, three, four, five,
这里,行末不需要逗号,我不想打印它。如何修改上面的代码而不是打印最后一个逗号?
可以使用enumerate
:
for idx, c in enumerate(str_list):
print c
if idx < len(str_list) - 1:
print ','
但是,我认为可能有更优雅的方式来处理这个问题。
编辑: 也许我以为我举了一个太简单的例子。假设我应该为每个迭代调用函数x(),除了最后一个迭代:
for idx, x in enumerate(list_x):
if idx < len(list_x) - 1:
something_right(x)
else:
something_wrong(x)
答案 0 :(得分:6)
', '.join(['one', 'two', 'three', 'four', 'five'])
内部有某种迭代;)
这实际上是最优雅的方式。
这是另一个:
# Everything except the last element
for x in a[:-1]:
print(x + ', ', end='')
# And the last element
print(a[-1])
输出one, two, three, four, five
答案 1 :(得分:3)
我愿意(你可以做join
,但这是不必要的,我认为这更优雅):
>>> print(*str_list, sep=', ')
one, two, three, four, five
很少有人知道sep
函数中的可选print
参数 - 默认情况下它是一个空格。 *
只需将list
解压缩到要打印的单独项目中。
修改强>
关于循环的示例,您正在检查每次迭代的条件,这有点傻。
相反,只需迭代到倒数第二个元素(range(len(a)) - 1
),然后在完成该循环时,再使用something_wrong()
的最后一个元素调用a
函数({{1 }})作为参数。
答案 2 :(得分:2)
如果您正在寻找更通用的解决方案来跳过最后一个元素,那么这可能很有用:
a = ['a','b','c','d']
for element,_ in zip( a, range(len(a) - 1) ):
doSomethingRight(element)
doSomethingWrong(a[-1])
说明:
当较短的列表用尽时,zip
将退出。因此,通过循环a
和range
一个较短的项目,您将doSomethingRight()
除了最后一个元素之外的所有元素。然后为最后一个元素调用doSomethingWrong()
。
在您的示例中,
str_list = ['one', 'two', 'three', 'four', 'five']
word_seperator = ","; string_end = "!"
result = ""
for element,_ in zip( str_list, range( len(str_list) - 1 ) ):
result += element + word_seperator # This is my 'doSomethingRight()'
result += str_list[-1] + string_end # This is my 'doSomethingWrong()'
结果:one,two,three,four,five!
希望这有帮助!
答案 3 :(得分:2)
if idx < len(list_x) - 1:
的一个问题是它只适用于序列,而不是更通用的任何迭代器。您可以编写自己的发电机,向前看并告诉您是否已达到目的。
def tag_last(iterable):
"""Given some iterable, returns (last, item), where last is only
true if you are on the final iteration.
"""
iterator = iter(iterable)
gotone = False
try:
lookback = next(iterator)
gotone = True
while True:
cur = next(iterator)
yield False, lookback
lookback = cur
except StopIteration:
if gotone:
yield True, lookback
raise StopIteration()
在python 2中,它看起来像:
>>> for last, i in tag_last(xrange(4)):
... print(last, i)
...
(False, 0)
(False, 1)
(False, 2)
(True, 3)
>>> for last, i in tag_last(xrange(1)):
... print(last, i)
...
(True, 0)
>>> for last, i in tag_last(xrange(0)):
... print(last, i)
...
>>>