2016-03-04 3 views
2

Привет У меня есть список чисел с некоторыми «Нет» в них, которые я хочу заменить другими числами в списке, которые не являются «Нет».Python заменяет числа в списке

Например, для приведенного ниже списка:

listP = [ 2.5, 3, 4, None, 4, 8.5, None, 7.3] 

Я хочу, чтобы эти два None элементы должны быть заменены случайными числами в списке, которые не являются сами по себе являются None. Таким образом, в этом примере None может быть заменен на 2.5 или 3 или 4 или 8.5 или 7.3.

Есть ли способ сделать это в одной строке кода?

+1

Ваш [предложил изменить] (https://stackoverflow.com/review/suggested-edits/11505354) было радикальное изменение, где вы сделали мой O (N) решение A O (N^2) один, потому что теперь вы пересчитываете список 'numbers' для каждой итерации *. Не хорошая идея!Для каждого числа, добавленного в список, вы экспоненциально увеличиваете объем выполненной работы; 2 номера занимают 4 шага, 10 номеров 100 шагов и т. Д. –

ответ

5

Вы должны будете использовать два шага; извлекать значения, не None для random.choice(), чтобы выбрать из, а затем использовать список понимание на самом деле выбрать случайные значения:

import random 

numbers = [n for n in listP if n is not None] 
result = [n if n is not None else random.choice(numbers) for n in listP]  
1

Вы можете filter список первых построить список not- None значений, а затем случайным образом выбрать из него с помощью choice:

import random 

listP = [ 2.5, 3, 4, None, 4, 8.5, None, 7.3] 
listR = filter(lambda x: x is not None, listP) 
print([l if l is not None else random.choice(listR) for l in listP]) 

результат:

[2.5, 3, 4, 7.3, 4, 8.5, 4, 7.3] 
0

Использование списковых

>>> [x if x else 'WHATEVER' for x in [ 2.5, 3, 4, None, 4, 8.5, None, 7.3]] [2.5, 3, 4, 'WHATEVER', 4, 8.5, 'WHATEVER', 7.2999999999999998]

+0

Это отвечает только на половину вопроса. –

+0

На самом деле есть 2 вопроса, и я отвечаю за тот, который находится в названии. Я считаю, что лучше изучить общие понятия, а не получить ответ на вашу конкретную проблему. И лучше задавать вопросы как можно более ограниченными. –

+0

Название не содержит вопроса вообще, и если это так, вы также не отвечаете на него (вы заменяете Nones, тогда как заголовок «спрашивает», как заменить номера). Я вижу только один вопрос: «Как заменить None на случайные числа из списка». Для этого может потребоваться несколько шагов, но это не вызывает много вопросов. –

0

Вы можете использовать следующее:

import random 

listP = [2.5, 3, 4, None, 4, 8.5, None, 7.3] 
numbers = [num for num in listP if num is not None] 
answer = [el if el is not None else random.choice(numbers) for el in listP] 
print(answer) 

Пример вывода

[2.5, 3, 4, 3, 4, 8.5, 8.5, 7.3] 

Это создает numbers список по отфильтровывая None значения из listP. Затем он использует подсчет списка с random.choice() для заполнения значений None со случайным выбором от numbers.

-1
  1. Получить любую ценность из списка, кроме None. Я использую функцию max, чтобы получить это.
  2. Проверить максимальное значение не None
  3. Использовать список, чтобы создать новый список, который заменяет значение None с максимальным значением.

Demo:

>>> listP = [ 2.5, 3, 4, None, 4, 8.5, None, 7.3] 
>>> l_max = max(listP) 
>>> if l_max: 
...  listP = [n if n is not None else max(listP) for n in listP] 
... 
>>> listP 
[2.5, 3, 4, 8.5, 4, 8.5, 8.5, 7.3] 
>>> 
  1. max является встроенной функцией.
  2. List Comprehension
+0

Я уверен, что с «случайным числом» OP не означало «любое [случайное число] (https://www.xkcd.com/221/), которое вам нравится», но на самом деле случайное число из этого списка, выбранное случайным образом каждый раз. –

+0

@tobias_k да, другим дается ответ, используя «случайное число». вопрос заключается в том, что заменить «Нет» на любое случайное значение из списка, поэтому мы можем выбрать любое значение из списка (кроме «Нет»). Я выбираю максимальное значение из списка. –

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