我一直在尝试“聚集”列表
我的意思是根据它们之间的项目将项目放在一起,因此当“聚集”在任何['d','-','g','p','q','-','a','v','i']
周围时,['d-g','p','q-a','v','i']
变为'-'
这是我的尝试:
def clump(List):
box = []
for item in List:
try:
if List[List.index(item) + 1] == "-":
box.append("".join(List[List.index(item):List.index(item)+3]))
else:
box.append(item)
except:
pass
return box
但是,它输出(对于上面的示例)
['d-g', '-', 'g', 'p', 'q-a', '-', 'a', 'v']
由于我不知道如何跳过接下来的两项
另外,代码是一团糟,主要是由于try和except语句(我使用它,否则当到达最后一项时会得到
IndexError
)如何解决(或完全重写)?
谢谢
最佳答案
这是一个O(n)解决方案,该解决方案维护一个标志来确定您当前是否聚集。然后,它根据以下条件处理列表中的最后一项:
def clump(arr):
started = False
out = []
for item in arr:
if item == '-':
started = True
out[-1] += item
elif started:
out[-1] += item
started = False
else:
out.append(item)
return out
实际上:
In [53]: clump(x)
Out[53]: ['d-g', 'p', 'q-a', 'v', 'i']
如果列表中的第一项是破折号,则此解决方案将失败,但看起来它应该是无效的输入。