使用大小列表拆分字符串的pythonic方法是什么?

2024-09-30 20:29:08 发布

您现在位置:Python中文网/ 问答频道 /正文

什么是pythonic方法来实现这一点:

s = "thisismystring"
keys = [4, 2, 2, 6]
new = []
i = 0
for k in keys:
    new.append(s[i:i+k])
    i = i+k

这确实给了我['this', 'is', 'my', 'string']我所需要的,但我觉得有一个更优雅的方式来做。建议?你知道吗


Tags: 方法innewforstringismy方式
3条回答

您可以使用^{},也许:

from itertools import accumulate

s = "thisismystring"
keys = [4, 2, 2, 6]
new = []
start = 0
for end in accumulate(keys):
    new.append(s[start:end])
    start = end

您可以通过添加另一个从零开始的accumulate()调用来内联start值:

for start, end in zip(accumulate([0] + keys), accumulate(keys)):
    new.append(s[start:end])

此版本可制成列表:

[s[a:b] for a, b in zip(accumulate([0] + keys), accumulate(keys))]

后一版本的演示:

>>> from itertools import accumulate
>>> s = "thisismystring"
>>> keys = [4, 2, 2, 6]
>>> [s[a:b] for a, b in zip(accumulate([0] + keys), accumulate(keys))]
['this', 'is', 'my', 'string']

双累积可以用tee()替换,包装在^{} function from the ^{} documentation中:

from itertools import accumulate, chain, tee

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

[s[a:b] for a, b in pairwise(accumulate(chain([0], keys)))]

我加入了一个^{} call作为0起始位置的前缀,而不是用连接创建一个新的list对象。你知道吗

我会用enumerate来表示这一点,加上:

[s[sum(keys[:i]): sum(keys[:i]) + k] for i, k in enumerate(keys)]

以您的例子:

>>> s = "thisismystring"
>>> keys = [4, 2, 2, 6]
>>> new = [s[sum(keys[:i]): sum(keys[:i]) + k] for i, k in enumerate(keys)]
>>> new
['this', 'is', 'my', 'string']

可能使用islice。可能效率不高,但至少有趣和简单。你知道吗

>>> from itertools import islice
>>> s = 'thisismystring'
>>> keys = [4, 2, 2, 6]

>>> it = iter(s)
>>> [''.join(islice(it, k)) for k in keys]
['this', 'is', 'my', 'string']

相关问题 更多 >