我想知道对for循环中的最后一个元素进行特殊处理的最佳方法(更紧凑和"pythonic"方式).有一段代码只能在元素之间调用,在最后一个元素中被抑制.
以下是我目前的工作方式:
for i, data in enumerate(data_list):
code_that_is_done_for_every_element
if i != len(data_list) - 1:
code_that_is_done_between_elements
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法?
注意:我不想使用hacks,例如使用reduce;)
我想循环检查每个项目的列表与其后面的项目.
有没有办法可以循环使用除了最后一项使用x中的所有项目?如果可以的话,我宁愿不使用索引.
注意
freespace回答了我的实际问题,这就是我接受答案的原因,但是SilentGhost回答了我应该问的问题.
为混乱道歉.
在Python 2.6中从迭代器获取最后一项的最佳方法是什么?例如,说
my_iter = iter(range(5))
Run Code Online (Sandbox Code Playgroud)
什么是最短的代码/最干净的方式4来自my_iter?
我可以做到这一点,但它看起来效率不高:
[x for x in my_iter][-1]
Run Code Online (Sandbox Code Playgroud) 我需要对列表中的最后一个元素进行一些特殊操作.还有比这更好的方法吗?
array = [1,2,3,4,5]
for i, val in enumerate(array):
if (i+1) == len(array):
// Process for the last element
else:
// Process for the other element
for elt in itertools.chain.from_iterable(node):
if elt is the last element:
do statement
Run Code Online (Sandbox Code Playgroud)
我如何实现这一目标
当我在for循环中使用生成器时,它似乎"知道",当没有更多元素产生时.现在,我必须使用没有for循环的生成器,并手动使用next()来获取下一个元素.我的问题是,我怎么知道,如果没有更多的元素?
我只知道:next()引发一个异常(StopIteration),如果没有剩下的东西,那么对于这样一个简单的问题来说,这不是一个例外吗?是不是像has_next()那样的方法?
以下几行应该说清楚,我的意思是:
#!/usr/bin/python3
# define a list of some objects
bar = ['abc', 123, None, True, 456.789]
# our primitive generator
def foo(bar):
for b in bar:
yield b
# iterate, using the generator above
print('--- TEST A (for loop) ---')
for baz in foo(bar):
print(baz)
print()
# assign a new iterator to a variable
foobar = foo(bar)
print('--- TEST B (try-except) ---')
while True:
try:
print(foobar.__next__())
except StopIteration:
break
print()
# assign …Run Code Online (Sandbox Code Playgroud) 显然,某些csv输出实现会在最后一行的右侧截断字段分隔符,而在字段为空时仅截断文件中的最后一行.
示例输入csv,字段'c'和'd'可以为空:
a|b|c|d
1|2||
1|2|3|4
3|4||
2|3
Run Code Online (Sandbox Code Playgroud)
在下面的脚本中,我怎么知道我是否在最后一行,所以我知道如何正确处理它?
import csv
reader = csv.reader(open('somefile.csv'), delimiter='|', quotechar=None)
header = reader.next()
for line_num, row in enumerate(reader):
assert len(row) == len(header)
....
Run Code Online (Sandbox Code Playgroud) 是否有一种优雅和pythonic的方法来捕获for循环中的第一个和最后一个项目,迭代生成器?
from calendar import Calendar
cal = Calendar(6)
month_dates = cal.itermonthdates(year, month)
for date in month_dates:
if (is first item): # this is fake
month_start = date
if (is last item): # so is this
month_end = date
Run Code Online (Sandbox Code Playgroud)
此代码尝试获取该月结束的一周中的第一天,以及该月结束的一周中的最后一天.示例:对于6月,月开始应评估为5/31/09.虽然从技术上说它是五月的一天,但这是六月开始的一周的第一天.
月日是一个生成器,所以我不能做[:-1]的事情.有什么更好的方法来处理这个问题?
我有一个我从中读取的文件,如下所示:
1 value1
2 value2
3 value3
Run Code Online (Sandbox Code Playgroud)
该文件在最后一行中可能有也可能没有尾随\n.
我正在使用的代码效果很好,但如果有一个尾随\n它失败了.
什么是抓住这个的最好方法?
我的代码供参考:
r=open(sys.argv[1], 'r');
for line in r.readlines():
ref=line.split();
print ref[0], ref[1]
Run Code Online (Sandbox Code Playgroud)
哪一个会失败的:
Traceback(最近一次调用最后一次):
文件"./test",第14行,在
print ref [0]中,ref [1]
IndexError:列表索引超出范围
如果有一个列表,比方说a=[1,2,3],我希望看到if a[4] is null,有没有办法做到这一点,而不使用异常或断言?
for i in range(len(results_histogram)):
if i!=len(results_histogram)-1:
url+=str(results_histogram[i])+','
Run Code Online (Sandbox Code Playgroud)
我的if语句正在检查我是否在最后一个循环中,但它不起作用.我究竟做错了什么?