在Python列表中合并一些列表项

51

假设我有一个像这样的列表:

[a, b, c, d, e, f, g]
如何修改那个列表,使其看起来像这样?
[a, b, c, def, g]

我更喜欢它直接修改现有的列表,而不是创建一个新列表。


2
合并应该基于什么依据进行? - Stephan202
3
a、b等是什么数据类型?直接在Python解释器中输入会出现错误,因为它们并没有绑定到任何对象。 - Martin v. Löwis
你是否总是想要将列表中的那些项目连接起来,还是希望稍后能够选择在哪里以及多少个进行连接? - tgray
5个回答

72

合并的依据是什么?你的问题有些模糊。此外,我假设a、b、...、f应该是字符串,也就是说,'a'、'b'、...、'f'。

>>> x = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> x[3:6] = [''.join(x[3:6])]
>>> x
['a', 'b', 'c', 'def', 'g']

请查阅关于 序列类型 的文档,特别是关于 可变序列类型字符串方法 的文档。


41

那个例子相当模糊,但或许可以做出像这样的东西?

items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
items[3:6] = [''.join(items[3:6])]

这基本上执行了一个splice(或对于slice的赋值)操作。它删除了第3到6项,并在它们的位置插入了一个新的列表(在本例中是包含一个项目的列表,该项目是被删除的三个项目的连接)。

对于任何类型的列表,您都可以这样做(使用+运算符对所有项目执行操作,无论其类型如何):

items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
items[3:6] = [reduce(lambda x, y: x + y, items[3:6])]

这个代码利用了 reduce 函数和一个使用 + 操作符将元素相加的 lambda 函数。


这对于字符串列表非常有效。如果元素不是字符串,则需要使用其他东西而不是''.join()。 - tgray
没错,我添加了一个使用 reduce 的示例,可以适用于任何支持 + 运算符的类型。除非提问者进一步扩展问题,否则我无法再做更多的工作。 - Blixt
他的问题除了字符串之外,没有任何意义。 - Lennart Regebro
赞同使用reduce的通用解决方案 - 尽管该问题似乎只对字符串有意义,但将列表中所有元素相互附加的通用解决方案是一个很好的方法。 - Robert Muil

5

只是一种变化

alist=["a", "b", "c", "d", "e", 0, "g"]
alist[3:6] = [''.join(map(str,alist[3:6]))]
print alist

1
当然,@Stephan202给出了一个非常好的答案。我提供了一个替代方案。
def compressx(min_index = 3, max_index = 6, x = ['a', 'b', 'c', 'd', 'e', 'f', 'g']):
    x = x[:min_index] + [''.join(x[min_index:max_index])] + x[max_index:]
    return x
compressx()

>>>['a', 'b', 'c', 'def', 'g']

你也可以做以下事情。
x = x[:min_index] + [''.join(x[min_index:max_index])] + x[max_index:]
print(x)

>>>['a', 'b', 'c', 'def', 'g']

0

我的心灵感应能力并不是特别强,但我认为这就是你想要的:

def merge(list_of_strings, indices):
    list_of_strings[indices[0]] = ''.join(list_of_strings[i] for i in indices)
    list_of_strings = [s for i, s in enumerate(list_of_strings) if i not in indices[1:]]
    return list_of_strings

我应该指出,因为这可能不明显,它与其他答案中提出的不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接