将列表中的字符串一起添加

时间:2019-05-28 11:30:00

标签: python string list

我想将列表["A","B","A","A","B"]转换为列表["AB","BA","AA","AB"]

我试图定义一个新列表,在该列表中删除第一个元素,然后将列表的字符串添加在一起。之后,我计划删除新列表的最后一个元素以获取结果。

lista = sequences
lista.pop(0)
print(lista)

for x in range(sequences):
    mc =sequences[x]+lista[x]

但是我得到的只是

  

TypeError:“列表”对象不能解释为整数

欢迎任何帮助。

编辑:谢谢大家,您所有的解决方案都运行良好:)

4 个答案:

答案 0 :(得分:12)

使用zip()

>>> lst = ["A","B","A","A","B"]
>>> [x + y for x, y in zip(lst, lst[1:])]
['AB', 'BA', 'AA', 'AB']

答案 1 :(得分:11)

使用zip的最佳解决方案,最聪明:

>>> l = ["A","B","A","A","B"]
>>> [x + y for x, y in zip(l, l[1:])]
['AB', 'BA', 'AA', 'AB']
>>> 

或使用此列表理解:

>>> l = ["A","B","A","A","B"]
>>> [v + l[i + 1] for i, v in enumerate(l[:-1])]
['AB', 'BA', 'AA', 'AB']
>>> 

答案 2 :(得分:6)

您可以使用map()

s = list(map(str.__add__, lst[:-1], lst[1:]))

使用operator.concat()更好(感谢您的建议,@ MykolaZotko):

import operator

s = list(map(operator.concat, lst[:-1], lst[1:]))

更新。

我决定对更大的数据进行一些测试。

import operator

lst = [...] # list with 10000 random uppercase letters


def test1():
    return list(map(operator.concat, lst[:-1], lst[1:]))


def test2():
    return [x + y for x, y in zip(lst, lst[1:])]


def test3():
    return [v + lst[i + 1] for i, v in enumerate(lst[:-1])]


def test4():
    s = ''.join(lst)
    return [s[i:i + 2] for i in range(len(s) - 1)]


if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test1()", setup="from __main__ import test1, lst", number=10000))
    print(timeit.timeit("test2()", setup="from __main__ import test2, lst", number=10000))
    print(timeit.timeit("test3()", setup="from __main__ import test3, lst", number=10000))
    print(timeit.timeit("test4()", setup="from __main__ import test4, lst", number=10000))

结果:

  1. Python 2:

    10.447159509
    11.529946446
    20.962497298000002
    20.515838672
    
  2. Python 3:

    10.370675522
    11.429417197
    20.836504865999995
    20.422865353
    

在更大的数据上,map()快了(〜9%),但是test1()test2()之间没有显着差异

答案 3 :(得分:3)

原始代码中有几个问题:

while (++next != last)

首先,语句sequences = ["A","B","A","A","B"] lista = sequences lista.pop(0) print(lista) for x in range(sequences): mc =sequences[x]+lista[x] 不会复制序列。相反,lista = sequenceslista成为同一列表的两个不同名称。您使用一个名字所做的事情也会发生在另一个名字上。 sequenceslista.pop(0)相同。如果要复制,请导入sequences.pop(0)库。

copy

第二,您的陈述import copy sequences = ["A","B","A","A","B"] lista = copy.copy(sequences) lista.pop(0) print(lista) for x in range(sequences): mc =sequences[x]+lista[x] 不正确。 range(sequences)函数接受整数作为输入,而不是列表。这就是给您range()

的原因
TypeError: 'list' object cannot be interpreted as an integer

# VALID range(5) range(3) range(10) # INVALID range(["A","B","A"]) range(["eyes", "nose", "tail"]) 是一个列表。您不想sequences range(len(sequences))

最后,我们可以修改您的原始代码以供使用:

range(sequences)