Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于给定索引合并列表中的元素_Python_List - Fatal编程技术网

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)都很好。这为我解决这类问题开辟了道路:)