2016-11-06 2 views
-2

Допустим, у меня есть столбец, содержащий три значенияКак векторизации столбец в числовом значении в Python

a = ["Hello","Jello","Hello","Hello"] 

Я хочу, чтобы преобразовать его в

a = [1,0,1,1] 

Какой самый быстрый способ сделать это Python.

+0

Конверсия на основе чего? – Maroun

+0

Что делать, если бы было другое дополнительное значение, например '[" Hello "," Jello "," Hello "," Hello "," Yellow "]'? как это следует учитывать? – RomanPerekhrest

+0

Почему «Hello» отображается 1, а не 0? Это видно первым в списке (один из возможных критериев), и он сортируется ниже, чем «Jello» (другой). Это только на основе равенства с «Привет»? Этот вопрос очень неуточнен. – DSM

ответ

2

Я думаю, что понимание списка - это питонический способ справиться с этим.

a = [x == 'Hello' for x in a] 

Edit: Как уже упоминалось в комментариях, это будет возвращать список булевы, а не целые числа. Для целых чисел, необходимо изменить список понимание:

a = [1 if x == 'Hello' else 0 for x in a] 

или

a = [int(x == 'Hello') for x in a] 

Реквизит пойти в Марун Марун и Альберто Vassena для двух правильных решений.

Edit2: Я приуроченная обе версии, и вот результат:

Первый сценарий:

from timeit import default_timer as timer 

a = ['Hello', 'Jello', 'Hello', 'Hello'] 

start = timer() 
b = [1 if x == 'Hello' else 0 for x in a] 
end = timer() 
print b 
print('without cast: {}'.format(end - start)) 

Результат:

[1, 0, 1, 1] 
without cast: 2.86102294922e-06 

Второй сценарий:

from timeit import default_timer as timer 

a = ['Hello', 'Jello', 'Hello', 'Hello'] 

start = timer() 
b = [int(x == 'Hello') for x in a] 
end = timer() 
print b 
print('with cast: {}'.format(end - start)) 

Результат:

[1, 0, 1, 1] 
with cast: 5.96046447754e-06 

поэтому тест дает, что при использовании if else конструкция быстрее в этом случае.

+1

Это вернет список« True » 'и' False', нет? Также это слишком усложняет алгоритм преобразования OP. – Maroun

+0

Вы правы, это возвращает логические значения. Кроме того, он выполняет именно то, что указано ОП. – sobek

+2

'int (x == 'Hello')' исправляет это. – Maroun

1

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

a = [(1 if 'Hello' == el else 0) for el in a] 

Но я думаю, что Себек, безусловно лучший. ;)

1

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

a = ["Hello","Jello","Hello","Hello"] 

b = [int(x == list(set(a))[0]) for x in a ] 

b = [1, 0, 1, 1] 

Это был ответ, который я искал.

+0

Обратите внимание, что кастинг - это медленная реализация этих двух. – sobek

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