2016-12-03 2 views
5

Таким образом, мне нужно, чтобы преобразовать список с подсписками, которые имеют 2 элемента в каждом из них одну строкимо преобразовать список с подсписками, которые имеют 2 элемента в каждом из них одну строки

Что у меня есть:

[['A','B'],['C','D']] 

как там, что я хочу, чтобы быть преобразованы в:

"ABCD" 

Я попытался это:

list=[['A','B'],['C','D']] 

hello="" 

for i in list: 

    hello=hello+i 

print (hello) 

Говорит, что у меня есть TypeError, и я не могу понять, почему.

ответ

3

Says that I have a TypeError, and I can´t understand why

Ошибка вы получили довольно многословен: TypeError: «список» Невозможно преобразовать объект ул неявно, что означает, что вы не можете неявно конкатенации объекта списка с объектом строки, как [1,2] + "hello"

с другой стороны, вы можете объединить списки, и в вашем простом случае это ''.join(list[0]+list[1]) также даст ожидаемый результат ABCD

Используйте str.join(iterable) функцию (или присоединиться к itertools.chain.from_iterable функции, которые должны идти быстрее):

l = [['A','B'],['C','D']] 
hello = ''.join(''.join(w) for w in l) 

print(hello) 

Выход:

ABCD 

https://docs.python.org/3.5/library/stdtypes.html?highlight=join#str.join

2

попробовать этот

sampleData = [['A','B'],['C','D']] 
output = "".join("".join(i) for i in sampleData) 
print (output) 

или

sampleData = [['A','B'],['C','D']] 
output = "" 
for i in sampleData: 
    output += "".join(i) 
print (output) 

выход

ABCD 

Ошибка вы получаете becouse вы пытаетесь добавить список и строку

2

Вы можете сделать это в то время как только называя str.join() один раз и используя список понимание:

''.join([char for element in [['A', 'B'], ['C', 'D']] for char in element]) 

Выходы:

'ABCD' 
4

У вас есть список из итерации так как вещие образом, использовать itertools.chain.from_iterable выравниваться список затем присоединиться символами с str.join() методом:

In [12]: from itertools import chain 

In [13]: lst = [['A','B'],['C','D']] 

In [14]: ''.join(chain.from_iterable(lst)) 
Out[14]: 'ABCD' 

Вот тест с использованием двух join, который показывает, что itertools подхода 2+ раз быстрее:

In [19]: %timeit ''.join(chain.from_iterable(lst)) 
10000 loops, best of 3: 114 µs per loop 

In [20]: %timeit ''.join(''.join(w) for w in lst) 
1000 loops, best of 3: 250 µs per loop 
+0

Я думаю, если мы говорим об измерениях, 'из itertools import chain' также следует учитывать и приурочить. Подобно аргументу 'setup' для модуля' timeit.Timer': 'timeit.Timer ('a = s [:];', setup = 'import random; s = [random.random() для i в диапазоне (1000)] ') ' – RomanPerekhrest

+1

@RomanPerekhrest Это не имеет большого значения, поскольку это происходит только один раз. И легко пренебрежимо мало. – Kasramvd

+0

согласился, использование 'itertools.chain' будет быстрее, так или иначе – RomanPerekhrest

0

результаты TypeError от вашей работы, чтобы добавить подсписок я к строке привет. Я считаю, что это происходит потому, что операция не поддерживается между списком типов и ул, как можно видеть в следующих примерах:

['a', 'b']+'2' 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: can only concatenate list (not "str") to list 

'2'+['a', 'b'] 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: Can't convert 'list' object to str implicitly 

Существуют различные ответы, выше которых рекомендует альтернативный код и использовать метод «присоединиться». Однако я, хотя я бы включать в себя альтернативу, которая использует чисто петли:

l = [['A','B'],['C','D']] 

hello = "" 
for sublist in l: 
    for element in sublist: 
     hello += str(element) 
print(hello) 

отметить, что это, вероятно, медленнее, чем другие методы. Кроме того, я рекомендую не использовать «список» в качестве имени переменной, поскольку он уже используется классом.

Смежные вопросы