在Python中,我有一个零和一个列表(可能很长),例如
L = [0,1,0,1,1,0,1,0,0,1]
我想在不使用循环的情况下翻转列表中的每个条目,例如,将0设为0并将1设为0。
我的想法如下:这个L可以被视为实数的二进制表示。所以我希望L变为0101101001
,然后我认为有一些操作可以直接进行翻转工作。最后,我需要将翻转的术语重新列入列表,即1010010110
到[1,0,1,0,0,1,0,1,1,0]
有没有办法在Python中实现这个想法(不使用numpy
)?这种方法会明显快于循环吗?这种方法是否是实现这一目标的最快方法?
这是一个面试问题。我无法在现场回答。我不允许使用像numpy
这样的库。
答案 0 :(得分:2)
您可以使用lambda和map:
来完成<div class="fb-comments" data-href="http://www.whatever.com/reviews/{{model.id}}" data-width="510px" data-numposts="10"></div>
答案 1 :(得分:1)
将列表转换为字符串,使用str.translate
进行替换,将其重新转换为列表。
import string
d = [0,1,0,1,1,0,1,0,0,1]
e = ''.join(map(str,d))
table = string.maketrans('01','10')
f = e.translate(table)
g = map(int,f)
>>> d
[0, 1, 0, 1, 1, 0, 1, 0, 0, 1]
>>> g
[1, 0, 1, 0, 0, 1, 0, 1, 1, 0]
>>>
您也可以使用递归来迭代而不使用循环
def foo(seq, result = None):
if result is None:
result = list()
if not seq:
return result
result.append(1 if seq[0] == 0 else 0)
return foo(seq[1:], result)
>>> print(foo(d))
[1, 0, 1, 0, 0, 1, 0, 1, 1, 0]
>>>
答案 2 :(得分:0)
您可以使用列表推导和按位XOR运算符(^)来实现这一点,以便翻转每个位:
var form = this;
答案 3 :(得分:0)
您可以通过以下方式执行此操作:
从列表中创建迭代器,
冻结字符串文字中迭代器的next
项,
在字符串中执行翻转操作,
在字符串文字的扩展版本上调用eval
:
from operator import not_
L = [0,1,0,1,1,0,1,0,0,1]
it = iter(L)
s = 'int(not_(next(it))),' * len(L)
print(eval(s))
# (1, 0, 1, 0, 0, 1, 0, 1, 1, 0)
要返回列表,请使用list(eval(s))
:[1, 0, 1, 0, 0, 1, 0, 1, 1, 0]
否则,您只需使用map
直接翻转每个项目,如果它不算作循环。