如何从('a','b','c')获取('a','a / b','a / b / c')?

时间:2019-02-21 19:35:36

标签: python

我如何才能从这种结构中走出来

>>> input = ['a', 'b', 'c']

对此

>>> output 
['a', 'a/b', 'a/b/c']

以一种优雅的(实用的)方式?

现在我有这个:

>>> from functools import reduce
>>> res = []
>>> for i in range(len(input)):
...     res.append(reduce(lambda a, b: a + '/' + b, input[:i+1]))
... 
>>> res
['a', 'a/b', 'a/b/c']

6 个答案:

答案 0 :(得分:11)

您可以使用itertools.accumulate()

from itertools import accumulate
l = ['a', 'b', 'c']
print(list(accumulate(l, '{}/{}'.format)))

这将输出:

['a', 'a/b', 'a/b/c']

答案 1 :(得分:2)

这应该有效:

null

答案 2 :(得分:2)

您可以使用简单的列表理解来实现。

l = ['a', 'b', 'c']
['/'.join(l[:i]) for i in range(1, len(l)+1)]
# ['a', 'a/b', 'a/b/c']

如果性能很重要,则可以推出自己的accumulate实现:

out = [l[0]]
for l_ in l[1:]:
    out.append('{}/{}'.format(out[-1], l_))

out
# ['a', 'a/b', 'a/b/c']

对于给定的问题,这比itertools快一点。

答案 3 :(得分:1)

如果必须使用reduce,可以这样做:

from functools import reduce

input = ['a', 'b', 'c']
output =  [reduce(lambda a, b: f"{a}/{b}", input[:n + 1]) for n in range(0, len(input))]

我更喜欢内置的join函数:

output =  ['/'.join(input[:n + 1]) for n in range(0, len(input))]

答案 4 :(得分:1)

您可以使用count分步切割字符串:

from itertools import count

input = ['a', 'b', 'c']

s = '/'.join(input)
c = count(1, 2)
[s[:next(c)] for _ in input]
# ['a', 'a/b', 'a/b/c']

答案 5 :(得分:0)

递归解决方案:

这个想法很简单,我们使用分而治之。 如果我们知道第n-1个字符串(或char)的答案,就可以解决问题,在这种情况下,我们需要做的就是将所有字符收集在一个字符串中,并用'/'('a / b / c')。

我们传递一个空列表作为第二个参数来存储结果。

input = ['a', 'b', 'c']

def foo(list1, list2):
    if (len(list1) == 0):
        return list2
    else:
        s = list1[0]
        for char in list1[1:]:
            s += '/' + char
        list2.insert(0, str)
        return foo(list1[:-1], list2)

>>> foo(input, [])

['a', 'a/b', 'a/b/c']