繁体   English   中英

有没有更优雅的/ pythonic方式来表达这种结构?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM