gpt4 book ai didi

python - 在 Python 中折叠或展开列表子序列的优雅方式?

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:18 25 4
gpt4 key购买 nike

我想折叠或展开列表的子序列

例如['A', 'B', 'D', 'E', 'H'] -> ['AB', 'DE', 'H']反之亦然

编辑:上面的例子可能会引起误解。以下是更好的:

例如['foo', 'bar', 'wtf'] <-> ['baz', 'wtf']

目前我写了一些丑陋的代码,比如:

while True:
for i, x in enumerate(s):
if x == 'foo' and s[i+1] == 'bar':
s[i:i+2] = 'baz'
break
else:
break

对于问“为什么要做那件事”的人:

实际上,我正在研究优化编译器,这是窥视孔部分。写模式匹配有点烦人。

附言我发现下面的代码有效,但是有点可笑,为什么枚举知道我们的修改?

s = ['foo', 'bar', 'wtf', 'foo', 'bar', 'wtf', 'foo', 'bar', 'wtf']

def collapse():
for i, x in enumerate(s):
if s[i] == 'foo' and s[i+1] == 'bar':
s[i:i+2] = ['baz']

def expand():
for i, x in enumerate(s):
if s[i] == 'baz':
s[i:i+1] = ['foo', 'bar']

collapse()
print s
expand()
print s

最佳答案

我不会说这更好,但这是一种不同的方式,而且它还解决了 Justin 指出的怪癖。 (我更感兴趣的是从一个列表中找到一个子序列,我在谷歌上找不到一个好的函数)

def findsubseq(L, subseq):
if not subseq: return # just die on zero-len input
i = -1
try:
while True:
i = L.index(subseq[0], i+1)
for j in range(1, len(subseq)):
if L[i+j] != subseq[j]:
break
else:
yield i
except ValueError: pass
except IndexError: pass

def replace(target, changethis, tothis):
subseqs = [x for x in findsubseq(target, changethis)]
subseqs.reverse()
for i in subseqs:
target[i:i+len(changethis)] = tothis
def collapse():
global s
replace(s, ['foo', 'bar'], ['baz'])
def expand():
global s
replace(s, ['baz'], ['foo', 'bar'])

s = ['foo', 'bar', 'wtf', 'foo', 'bar', 'wtf',
'foo', 'bar', 'bar', 'bar', 'foo']
print s
collapse()
print s
expand()
print s

C:\Scripts>subseq.py
['foo', 'bar', 'wtf', 'foo', 'bar', 'wtf', 'foo', 'bar', 'bar', 'bar', 'foo']
['baz', 'wtf', 'baz', 'wtf', 'baz', 'bar', 'bar', 'foo']
['foo', 'bar', 'wtf', 'foo', 'bar', 'wtf', 'foo', 'bar', 'bar', 'bar', 'foo']

编辑:将其概括为一个简单的替换函数

关于python - 在 Python 中折叠或展开列表子序列的优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2674647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com