2015-06-06 2 views
-5

У меня есть списокPython, добавив к списку

string = ['a', 'b', 'c', 'd', 'e', 'f'] 

Я пытаюсь сделать пространство между каждыми 2 символов списка, чтобы он стал таким:

['a', 'b', ' ', 'c', 'd', ' ', 'e', 'f'] 

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

test = 0 

while test != len(string): 
    for i in range(2): 

     string.append(' ') 
    test = test + 1 

print (string) 

Но это дает эту ошибку:

Traceback (most recent call last): 
    File "D:/Python/New folder (3)/test.py", line 8, in <module> 
    string.append(' ') 
MemoryError 
+1

[. Учебник здесь] (https://docs.python.org/3.4/tutorial/index.html) – TigerhawkT3

+4

Почему так много голосов? Это разумный вопрос. –

+3

Он не показывает исследовательских усилий и вряд ли будет полезен для всех, кто провел какое-либо исследование. – TigerhawkT3

ответ

-1

Используйте вставку, а не прилагайте. Добавление добавляется до конца.

string = ['a', 'b', 'c', 'd', 'e', 'f'] 
string.insert(4, ' ') 
string.insert(2, ' ') 

Или создайте совершенно новый список, в котором есть нужные места.

out = [] 
for i, char in enumerate(string): 
    out.append(char) 
    if i != 0 and i % 2 != 0: 
     out.append(' ') 

Ошибка памяти вызвана тем, что цикл while никогда не заканчивается. Тест растет один на одну итерацию, но список растет 2.

+2

Список увеличивается на 2 за итерацию цикла while. – TigerhawkT3

+0

Вы можете заменить 'if i! = 0 и i% 2 == 0' на' if i и i% 2'. – TigerhawkT3

0

Используйте список понимания

Ваш тест никогда не будет проходить, потому что вы добавления в список каждый раз. Вы фактически добавляете конец списка, чтобы не получить то, что вы хотите.

подход мог бы использовать список понимание:

string = ['a', 'b', 'c', 'd', 'e', 'f'] 
#insert a space every two characters 
new_string = [[s, " "] if i % 2 else s for i, s in enumerate(string)] 
#flatten the list 
new_string = [item for sublist in new_string for item in sublist] 

Это может быть сделано в одной строке, как так:

[item for sublist in [[s, " "] if i % 2 else s for i, s in enumerate(string)] for item in sublist] 
+0

Часть '== 1' не нужна. – TigerhawkT3

+0

Спасибо, обновлено –

0

Вы можете сделать это следующим образом:

string = ['a', 'b', 'c', 'd', 'e', 'f'] 
newstring = [] 
i = 1 

for x in string: 
    if i > 2: 
     newstring.append(' ') 
     newstring.append(x) 
     i = 1 
    else: 
     newstring.append(x) 
    i += 1 

print newstring 

Кажется, гораздо яснее использовать этот метод, и он возвращает тот же результат.

0

Поскольку на самом деле никто не объяснил свою ошибку правильно:

Ваш while test != len(string): никогда не правда, как вы держите добавление к первоначальному списку, так что список только продолжает расти и расти, пока в конце концов, вы не кончатся RAM/памяти, вы должны не перебирать и добавлять в тот же список, вам нужно будет сделать копию или просто создать новый пустой список и добавить к нему.

Список начинается с 6 элементов, вы добавляете еще 2, прежде чем снова проверите свое состояние и увеличьте test на 1, поэтому после первого цикла у вас теперь есть 8 элементов в вашем списке, а тест 1, следующий цикл у вас есть 10 и тест равен 2 и так далее до тех пор, пока у вас не закончится память ...

Есть более эффективные способы, но если вы должны использовать петлю и вставить в исходный список, вы должны начать с третьего элемента и использовать шаг 3 :

string = ['a', 'b', 'c', 'd', 'e', 'f'] 


for i in range(2, len(string)+2, 3): 
     string.insert(i, " ") 

print (string) 

['a', 'b', ' ', 'c', 'd', ' ', 'e', 'f'] 

Вы также можете использовать itertools.цепь и поймать лишние пустые пространства в конце с ind < len(string) - 1:

from itertools import chain 

print(list(chain.from_iterable((ele, " ") if ind % 2 and ind < len(string) - 1 else ele 
          for ind, ele in enumerate(string)))) 

['a', 'b', ' ', 'c', 'd', ' ', 'e', 'f'] 
0

его не компактное решение, но его didatic:

a= ['1', '2','3','4','5','6'] 

Группа 'а' в 2-х символов:

for x in range(int(len(a)/2)): 
    a[x]=a[x]+a.pop(x+1) 

Затем a будет

['12', '34', '56']

Добавить место для каждого элемента (кроме е в прошлом):

for x in range(int(len(a))-1): 
    a[x]=a[x]+" " 

Теперь давайте создадим новый список расщеплению каждого из 'а' пунктов:

b=[] 
for x in range(int(len(a))): 
    b.extend(list(a[x])) 

Результат:

['1', '2', ' ', '3', '4', ' ', '5', '6'] 
Смежные вопросы