我如何才能从这种结构中走出来
>>> 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']
答案 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']