Python 基于给定索引合并列表中的元素
我想根据给定的元组开始和停止索引(元组不重叠)合并列表中的元素。我将保留那些没有提及的索引。这是我的例子Python 基于给定索引合并列表中的元素,python,list,Python,List,我想根据给定的元组开始和停止索引(元组不重叠)合并列表中的元素。我将保留那些没有提及的索引。这是我的例子 ls = ['1', '2', '3', '4', '5', '6', '7'] merge = [(1, 3), (5, 7)] 这里,我想将[1:3]中的索引和[5:7]合并在一起,这样输出应该如下所示 ['1', '23', '4', '5', '67'] 我尝试使用range(len(ls))循环,但这似乎不是解决此问题的正确方法。如果有人有简单的方法来解决这个问题,请告诉我。一
ls = ['1', '2', '3', '4', '5', '6', '7']
merge = [(1, 3), (5, 7)]
这里,我想将[1:3]
中的索引和[5:7]
合并在一起,这样输出应该如下所示
['1', '23', '4', '5', '67']
我尝试使用
range(len(ls))
循环,但这似乎不是解决此问题的正确方法。如果有人有简单的方法来解决这个问题,请告诉我。一个快速而肮脏的解决方案是:
ls = ['1', '2', '3', '4', '5', '6', '7']
merge = [(1, 3), (5, 7)]
result = []
index = 0
for start, end in merge:
result += ls[index:start]
result.append("".join(ls[start:end]))
index = end
print result # ['1', '23', '4', '5', '67']
使用反向合并列表的简短“技巧”:
ls = ['1', '2', '3', '4', '5', '6', '7']
merge = [(1, 3), (5, 7)]
for t in merge[::-1]:
merged = ''.join(ls[t[0]:t[1]]) # merging values within a range
ls[t[0]:t[1]] = [merged] # slice replacement
print(ls)
输出:
['1', '23', '4', '5', '67']
为了好玩,因为我一直在学习Haskell,一种递归解决方案:
def recursive(ls, merge):
if merge == []:
return ls
else:
x, xs = merge[0], merge[1:]
return ls[:x[0]] + [''.join(ls[x[0]:x[1]])] + recursive(ls, xs)[x[1]:]
但是,只有在没有重叠间隔的情况下才有效。合并元组是否保证不重叠?它们保证在任何订单中都有吗?ls[5:7]-->['6','7']
,你有没有打错?是的,没有重叠!我现在就解决这个问题。还有,我确实打了个错字。merge
中元组的顺序如何?请看我对Vadim的解决方案的评论,如果我们能考虑订购的话,那就更好了。然而,在这种情况下,我可以根据开始位置对合并
进行排序。啊,是的,这当然是一个合理的解决方案,尤其是与我最初发布的怪物相比。只有当合并
有序且没有重叠时,此解决方案才有效。(考虑两个这样的例子:merge=[(5,7)、(1,3)]
和merge=[(1,3)、(2,4)]
)。我在OP上问了一个问题。谢谢@Vadim!我不能同时接受这两种解决方案,所以我对你竖起了大拇指!不用担心,另一个解决方案绝对不错。干杯此解决方案还有一个额外的好处,即它不需要对合并
列表中的元组排序即可正常工作。@RomanPerekhrest,谢谢Roman。两种解决方案(来自您和Vadim)都很好。这为我解决这类问题开辟了道路:)