Спіс ненулявога элементаў у спісе ў Python

улічваючы спіс

a = [6, 3, 0, 0, 1, 0]

Які найлепшы спосаб у Python, каб вярнуць спіс

b = [1, 1, 0, 0, 1, 0]

дзе 1-й у б адпавядаюць ненулявога элементам у а. Я думаю, што працаваць для цыклу і проста дадаўшы на Ь, але я ўпэўнены, што павінен быць лепшы спосаб.

5

7 адказы

Спіс метад разумення:

a = [6, 3, 0, 0, 1, 0]
b = [1 if i else 0 for i in a]
print b
>>> 
[1, 1, 0, 0, 1, 0]

Timing мой, Дэйва метад і Lattyware ў невялікім змене :

$ python3 -m timeit -s "a = [6, 3, 0, 0, 1, 0]" "[1 if i else 0 for i in a]"
1000000 loops, best of 3: 0.838 usec per loop
$ python3 -m timeit -s "a = [6, 3, 0, 0, 1, 0]" "[int(i != 0) for i in a]"
100000 loops, best of 3: 2.15 usec per loop
$ python3 -m timeit -s "a = [6, 3, 0, 0, 1, 0]" "[i != 0 for i in a]"
1000000 loops, best of 3: 0.794 usec per loop

Падобна на тое, мой метад у два разы хутчэй ... Я на самой справе здзіўлены, што , што значна хутчэй. Дастаўшы Int() выклік, аднак, робіць два па сутнасці тое ж самае - але пакідае выніковы спіс поўны булева аператараў замест Цэлыя ( True/False замест 1/0)

10
дададзена
Гэта не добры спосаб часовага кода Python фрагментаў. Выкарыстоўвайце timeit модуль.
дададзена аўтар Gareth Latty, крыніца
@InbarRose Чаму вы ненавідзіце модуль?
дададзена аўтар Gareth Latty, крыніца
таму што вы не маеце адліўку, але і таму, што ваша іншае становішча вылічаецца толькі адзін раз у вашым прыкладзе
дададзена аўтар njzk2, крыніца
@Lattyware Вы абсалютна правы. Я проста ненавіджу гэты модуль. Вы можаце змяніць свой адказ з больш timeit паліцай. :)
дададзена аўтар Inbar Rose, крыніца
@Lattyware Гэта доўгая гісторыя - прыйсці да Python Chat Room, калі вы хочаце.
дададзена аўтар Inbar Rose, крыніца
Трохі прыдзіркі: False і [] не мелі нулявыя значэнні, але будзе вырабляць 0 у кодзе. Чаму б не зрабіць відавочным тое, што вы хочаце мець: 1, калі г = 0 яшчэ 0 !?
дададзена аўтар Achim, крыніца
b = [int(i != 0) for i in a]

Дамо вам тое, што вы шукаеце.

5
дададзена
Варта адзначыць, што True == 1 і Ілжывыя == 0 , так што проста [я! = 0 пры г у] будзе працаваць нармальна да таго часу, пакуль вы не пярэчыце ўяўленне быць іншым (гэта значыць, ён будзе вырабляць [Праўда, True, False, False, True, False] , але гэта будзе працаваць так жа, як запытаная спіс).
дададзена аўтар Gareth Latty, крыніца
@Lattyware абсалютна, проста спрабуючы адпавядаць жаданага выхаду OP яшчэ.
дададзена аўтар dave, крыніца

Для паўнаты карціны, і так як ніхто іншы дадаў гэты адказ:

b = map(bool, a)

Але яна вяртае лагічныя значэння і ня Цэлыя.

2
дададзена
Варта адзначыць, што ў 3.x, гэта вяртае генератар, а не спіс (натуральна, гэта можа быць зменены - пры неабходнасці, шляхам абкручванні з дапамогай выкліку спіс() ).
дададзена аўтар Gareth Latty, крыніца
+1 Гэта выдатна працуе, вяртаючы Boolean значэнні мае больш сэнсу, чым простыя цэлыя лікі, вы павінны дадаць гэта таймінгі
дададзена аўтар jamylak, крыніца

як наконт

>>> a = [6, 3, 0, 0, 1, 0]

>>> [bool(x) for x in a]
[True, True, False, False, True, False]

>>> [int(bool(x)) for x in a]
[1, 1, 0, 0, 1, 0]

У залежнасці ад таго, што вы хочаце яго, вы маглі б быць лепш з булева спісам.

1
дададзена

іншы спосаб

>>> a = [6, 3, 0, 0, 1, 0]

>>> [cmp(x,0) for x in a]
[1, 1, 0, 0, 1, 0]

Звярніце ўвагу, што CMP (х, 0) вяртае -1 для адмоўных лікаў, так што вы можаце захацець АБС гэта.

1
дададзена

Вы можаце таксама, у залежнасці ад вашага прыкладання, праца з Numpy прадстаўлення ў выглядзе масіва:

$ import numpy as np
$ a = [6, 3, 0, 0, 1, 0]
$ (np.array(a)!= 0).astype(int)
array([1, 1, 0, 0, 1, 0])

astype (цэлае) неабходна толькі, калі вы хочаце dont't лагічнае прадстаўленне

1
дададзена

І за чорт гэтага, яшчэ адзін спосаб:

[{0: 0}.get (el, 1) for el in your_list]
0
дададзена