比方说,我有这样的数据:使用Python创建的元组组从另一个列表中
data = [1, 2, 3, -4, -5, 3, 2, 4, -2, 5, 6, -5, -1, 1]
我需要它在另一个列表中的元组进行分组。一个元组由两个列表组成。一个是正数,另一个是负数。并且应该通过检查它是什么类型的数字来创建元组。最后一个负数(我的意思是负数之间没有正数)意味着,其他数字必须进入另一个元组,当它找到另一个负数时,它应该创建另一个元组。
所以规则是这样的:所有找到的数字都被添加到第一个元组中,当它找到负数时,它仍然将它添加到该元组中,直到找到正数(它意味着必须创建新元组)。
我觉得比较容易解释。解析data
后,名单应该是这样的:
l = [([1, 2, 3], [-4, -5]), ([3, 2, 4], [-2]), ([5, 6], [-5, -1]), ([1], [])]
我创建了一个解决方案,但我不知道这是相当理想。也许有可能写一个更优雅的(我想知道性能,有没有更好的方式来编写这样的解析器以获得最佳性能:))?
def neighborhood(iterable):
iterator = iter(iterable)
prev = None
item = iterator.next() # throws StopIteration if empty.
for next in iterator:
yield (prev,item,next)
prev = item
item = next
yield (prev,item,None)
l = []
pos = []
neg = []
for prev, item, next in neighborhood(data):
if item > 0:
pos.append(item)
if not next:
l.append((pos, neg))
else:
neg.append(item)
if next > 0:
l.append((pos, neg))
pos = []
neg = []
elif not next:
l.append((pos, neg))
print l
P.S. if not next
我认为部分主要检查后只能使用一次。
那里有许多魔力。非常有趣的使用一个迭代器喂两次压缩。 – spectras
看起来很有趣。另外我测试了性能,这个似乎比我的要快。当然这个样本数据非常小,但仍然是。我的解决方案在'〜0.33毫秒内完成,'〜0.03毫秒内完成' – Andrius
也许您应该从'zip'文档中添加这样的引用,以使代码正确:_“从左到右的评估顺序迭代是有保证的。“_ – spectras