翻转列表中的条目而不循环

时间:2016-06-26 19:45:48

标签: python bit-manipulation

在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这样的库。

4 个答案:

答案 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)

您可以通过以下方式执行此操作:

  1. 从列表中创建迭代器,

  2. 冻结字符串文字中迭代器的next项,

  3. 在字符串中执行翻转操作,

  4. 在字符串文字的扩展版本上调用eval

  5. 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直接翻转每个项目,如果它不算作循环