2016-09-11 2 views
3

Я пытаюсь решить эту проблему на codewars и я полностью озадачен:Заменить все отрицательные значения в списке

y = [-1, -1, 2, 8, -1, 4] 
z = [1,3,5] 
#to create [1,3,2,8,5,4] 

Как мне это сделать?

Я попытался сделать:

for e in range(len(y)): 
    try: 
     if y[e] < 0: 
      y[e] = z[e] 
    except: 
     pass 

Но это будет работать только если негативы соответствует тому, что находится в г.

+0

Так что ваш ожидаемый результат, если длина отрицательных чисел не равна с длиной 'z'. – Kasramvd

+0

Он всегда будет равным. – nodel

+0

Ex: y = [-1,2,2,1, -1] z = [5,5] – nodel

ответ

11

Если вы уверены, что количество отрицательных чисел всегда равно с z вы можете конвертировать z в итератор и использовать список понимание для создания нового списка:

In [9]: z = iter(z) 

In [10]: [next(z) if i < 0 else i for i in y] 
Out[10]: [1, 3, 2, 8, 5, 4] 

Обратите внимание, что если длина z короче, чем число отрицательных чисел, это поднимет ошибку StopIteration.

+1

Использование 'next' очень изящно и элегантно :-) –

0

Вы пытаетесь использовать один и тот же индекс для обоих списков, что, по-видимому, не соответствует правильному поведению вашего примера. Например, -1 в y с индексом 4, но заменяется 5 в z с индексом 2.

zindex = 0 
for yindex in range(len(y)): 
    if y[yindex] < 0: 
     y[yindex] = z[zindex] 
     zindex += 1 
0

Ваш код:

for e in range(len(y)): 
    if y[e] < 0: y[e] = z[e] 

Проблема с кода, скажем, 5-й элемент отрицательный. Вы пытаетесь установить 5-й элемент y на 5-й элемент z. Вместо этого вы должны использовать переменную счетчика для отслеживания того, какой элемент заменить.

element_z_index = 0 
for e in range(len(y)): 
    if y[e] < 0: 
     y[e] = z[element_z_index] 
     element_z_index += 1 
3

One-liner. Эмуляция поведения очереди с использованием pop(). (ПримечаниеЭтот потребляютz)

>>> print([num if num > 0 else z.pop(0) for num in y]) 
[1, 3, 2, 8, 5, 4] 
+1

Единственная проблема заключается в том, что он уничтожает z. Поэтому вам может понадобиться скопировать его. –

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