[英]Is there a more elegant / pythonic way to express this construct?
itemList = ["a","b","c","d","e","f","g","h"]
aa = "NULL"
bb = "NULL"
cc = "NULL"
for item in itemList:
aa = bb
bb = cc
cc = item
if aa == "NULL":
continue
print "%s_%s_%s" % (aa, bb, cc)
>>> ['_'.join(itemList[i:i+3]) for i in range(len(itemList)-2)]
['a_b_c', 'b_c_d', 'c_d_e', 'd_e_f', 'e_f_g', 'f_g_h']
或者如果您坚持打印:
>>> for i in range(len(itemList)-2):
print('_'.join(itemList[i:i+3]))
import itertools
def windows(iterable, length=2):
return itertools.izip(*(itertools.islice(it,n,None)
for n,it in enumerate(itertools.tee(iterable,length))))
itemList = ["a","b","c","d","e","f","g","h"]
for group in windows(itemList,length=3):
print('_'.join(group))
SilentGhost的雅致列表理解功能可以更好地解决此问题。 但是只是为了解释为什么我不删除这篇文章:
您可能有一天想从不是列表的迭代器生成窗口。 由于不能不消耗迭代器就占用它的长度,(而且由于某些迭代器可能是无限的),并且由于从迭代器中获取切片总是返回新值,因此不能使用列表推导['_'.join(itemList[i:i+3]) for i in range(len(itemList)-2)]
在这种情况下['_'.join(itemList[i:i+3]) for i in range(len(itemList)-2)]
。
那么windows
函数实际上是有用的。 例如:
def itemList():
for x in range(8):
yield str(x)
for group in windows(itemList(),length=3):
print('_'.join(group))
产量
0_1_2
1_2_3
2_3_4
3_4_5
4_5_6
5_6_7
您可以使用deque
。
itemList = ["a","b","c","d","e","f","g","h"]
buffer = collections.deque(maxlen=3)
for item in itemList:
buffer.append(item)
if len(buffer) != 3:
continue
print "%s_%s_%s" % (buffer)
我目前没有可用的Python解释器,但我认为这应该可行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.