【问题标题】:Binary list from indices of ascending integer list来自升序整数列表索引的二进制列表
【发布时间】:2020-08-24 04:59:32
【问题描述】:

我有一个从 0 开始的整数 e 的升序列表,我想要一个二进制列表 b,其 i-th 元素为 1 当且仅当 i 属于 e .

例如,如果e=[0,1,3,6],那么这个二进制列表应该是[1,1,0,1,0,0,1], 其中第一个 1 是因为 0 在 e 中,第二个 1 是因为 1 在 e 中, 第三个 0 是因为 2 不在e 中,以此类推。

你可以在下面找到我的代码。

我的问题是: python 中有内置的东西吗?如果不是,是我的 接近最有效率的?

def list2bin(e):
b=[1]
j=1
for i in range(1, e[-1]+1):
    if i==e[j]:
        b.append(1)
        j+=1
    else:
        b.append(0)     
return(b)

【问题讨论】:

    标签: python list binary


    【解决方案1】:

    这可以通过列表解析来完成,如果e 很大,那么最好先将其转换为set

    >>> e = [0, 1, 3, 6]
    >>> [int(i in e) for i in xrange(0, e[-1]+1)]
    [1, 1, 0, 1, 0, 0, 1]
    

    如果在列表中找到项目,in 运算符将返回 True/False,您可以使用 int 将该布尔值转换为整数。请注意,对于列表,inO(N) 操作,因此如果 e 很大,则将其转换为集合将提高效率。

    【讨论】:

    • 只是评论,xrange在Python3中不存在,除了解决方案很漂亮。
    • @Ashwini 谢谢!不幸的是,我必须使用列表。 e 不会那么大(最多 150 个元素,尽管稍后我可能会尝试使用 400 个左右),但这会被一遍又一遍地调用(我正在运行一个递归算法,它将运行周,我要问的将在每次迭代中出现)。在我的情况下,您认为每次都将列表变成一个集合有意义吗?
    • @geo909 timeit 结果:在大小为 400 的列表中搜索 400 需要 12 微秒,而一组只需 200 纳秒。
    • @Ashwini 谢谢.. 虽然它显然更优雅,但您的解决方案在效率方面更好,对吧?
    • @geo909 不,基于list 的版本理论上并不比您的解决方案好(因为它是O(N**2))并且对于大量列表来说会很慢。但是set 版本几乎等同于您的解决方案。
    【解决方案2】:

    我认为没有内置的方法可以做到这一点。但是你可以使用List Comprehensions:

    a = [ 1 if i in e else 0 for i in range(1, e[-1]+1) ]
    

    玩得开心。

    【讨论】:

      猜你喜欢
      • 2015-09-23
      • 2019-06-20
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      相关资源
      最近更新 更多