2016-09-29 2 views
3

Хорошо, я уверен, что есть очень простой способ сделать это, но я ржавый в python, и я не могу разобрать питонический способ сделать это.Python, создайте новый список на основе условия, применяемого к существующему списку одинаковой длины

У меня есть список, представляющий часы дня:

import numpy as np 
hourOfDay = np.mod(range(0, 100), 24) 

Тогда я хочу, чтобы создать новый список, который большее значение 0.4, когда час между 7 и 22 и 0.2 иначе ,

Есть несколько связанных должностей here и here, но они не совсем то, что я хочу (они заканчиваются коротким списком, я хочу список одинаковой длины).

Предполагая, что мне нужно использовать список понимание Я попытался это:

newList = [0.4 for hour in hourOfDay if hour <= 7 or hour >= 22 else 0.2] 
+1

Почти идеальный; 'for' идет в конце списка comp, условия идут первыми:' newList = [0.4 if hour <= 7 or hour> = 22 else 0.2 для часа в hourOfDay] ' –

+0

Спасибо @AndrasDeak! Стыдно, что я не попал туда сам; но, по крайней мере, это будет здесь для меня, чтобы найти следующий раз, когда я забываю, как работает python. – kabdulla

ответ

1

Ваш список постижение был немного выключен. Кроме того, если вы хотите 0.4 когда час между 7 и 22, вам нужно 7<= hour <= 22:

import numpy as np 
hourOfDay = np.mod(range(0, 100), 24) 

newList = [0.4 if 7 <= i <= 22 else 0.2 for i in hourOfDay] 

>>> newList 
[0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2] 
1

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

In [15]: hourOfDay = np.mod(range(0, 100), 24, dtype=np.float) 

In [16]: mask = np.logical_or(hourOfDay <= 7, hourOfDay >= 22) 

In [17]: hourOfDay[mask] = 0.4 

In [19]: hourOfDay[~mask] = 0.2 

In [20]: hourOfDay 
Out[20]: 
array([ 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 
     0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 
     0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.2, 
     0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 
     0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 
     0.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 
     0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 
     0.4, 0.4, 0.4, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 
     0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4, 0.4, 
     0.4]) 
1

Одним из альтернативного подхода заключается в том, чтобы использовать map() как:

map(lambda x: 0.4 if 7 <= x <= 22 else 0.2, hourOfDay) 
Смежные вопросы