【问题标题】:Expanding the inline python code [closed]扩展内联python代码[关闭]
【发布时间】:2014-09-30 18:27:25
【问题描述】:

我有一个值列表

a = [88,  24, 128, 3] 

现在我必须将这些值以二进制形式作为列表获取,例如

[0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1] 

最终输出如下,它以十六进制值给出上述二进制列表中 1 的位置

[0x2, 0x4, 0x5, 0xc, 0xd, 0x11, 0x1f, 0x20]

我的尝试:应该给出二进制列表

[((b>>i)&1)for b in a for i in range(7,-1,-1)]

现在我不知道如何获得最终输出,但代码必须在同一行内代码中。

最终输出应该是一个列表,其中包含二进制列表中 1 的位置。

我需要一个内嵌代码,因为我在 eval 函数中使用了此代码

【问题讨论】:

  • 我在字符串中有这个内嵌代码,内置的十六进制可能会影响它,即使使用内置的十六进制,我也无法获得最终输出
  • 所以你想把一个整数扩展为一个8位二进制数,然后……将每个8位数字表示为两个十六进制,每个四位?那正确吗?那么0101 (5) 是如何到达0x2 (2) 的呢?为什么你会从 4 位得到0x20?如果没有,你在做什么?您能描述一下您尝试实施的流程吗?
  • 你能解释一下你是如何从“二进制列表”到输出的吗?如果我采用二进制列表的“十六进制值”,我会得到0x58188003,而不是八元素列表。
  • 这里我想要一种映射,即二进制数组中的每个 1s 位置在最终输出中都应该有一个十六进制值。所以 0101(5) 在位置 2 有 1,在位置 4 有另一个 1。所以最终输出中有 [0x2 and 0x4]
  • 哦,我明白了。因此,您将整个列表视为向后十进制数,然后输出是列表中1s 的十六进制位置,从1 开始?在那种情况下,你到底为什么想要那个?你为什么要尝试在一行中完成它?

标签: python


【解决方案1】:

首先是最终答案,这确实是单行字。下面是一些解释

a = [88, 24, 128, 3]
[i + 1 for i, x in enumerate("".join(bin(n + 256)[3:] for n in a)) if x == "1"]

这会产生

[2, 4, 5, 12, 13, 17, 31, 32]

第一次转换:

def dec2bin(a):
    return [int(x) for x in "".join(bin(n + 256)[3:] for n in a)]

你的例子

>>> dec2bin([88, 24, 128, 3])
[0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]

然后获取位置

def positions(a):
    return [i for i in range(len(a)) if a[i] == 1]

最终输出

>>> positions(dec2bin([88, 24, 128, 3]))
[1, 3, 4, 11, 12, 16, 30, 31]

请注意,值减 1,因为 Python 数组从 0 开始。要获取您的值,只需将 1 添加到输出值:

def positions(a):
    return [i + 1 for i in range(len(a)) if a[i] == 1]

如果你真的需要它们的十六进制(它们将是字符串,而不是数字,因为数字没有内在的基础):

>>> list(map(hex, _))
['0x1', '0x3', '0x4', '0xb', '0xc', '0x10', '0x1e', '0x1f']

一行代码

>>> v = [88, 24, 128, 3]
>>> (lambda a: [i + 1 for i in range(len(a)) if a[i] == 1])([int(x) for x in "".join(bin(n + 256)[3:] for n in v)])
[2, 4, 5, 12, 13, 17, 31, 32]

lambda 不是必需的,您可以使用 enumerate 来编写它。您可以通过删除“int(x)”步骤来缩短行:

>>> v = [88, 24, 128, 3]
>>> [i + 1 for i, x in enumerate("".join(bin(n + 256)[3:] for n in v)) if x == "1"]
[2, 4, 5, 12, 13, 17, 31, 32]

注意 enumerate 的参数是一个生成器,而不是一个列表。 join 的参数也一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多