我想将列表["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:“列表”对象不能解释为整数
欢迎任何帮助。
编辑:谢谢大家,您所有的解决方案都运行良好:)
答案 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))
结果:
Python 2:
10.447159509
11.529946446
20.962497298000002
20.515838672
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 = sequences
和lista
成为同一列表的两个不同名称。您使用一个名字所做的事情也会发生在另一个名字上。 sequences
与lista.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)