列表理解产生结果加上乱码

list comprehension producing result plus gibberish

我已经为此苦苦挣扎了几个小时。我想要做的是生成一个列表,其中包含数字后跟 "dB"(即 0dB、1dB、2dB...高达 8dB)。这是为了让我不必手动输入我正在制作的情节的每个标签。

我首先尝试的是:

 cb.ax.set_yticklabels([x + 'dB' for x in str(np.arange(0, 9))])

但是,这似乎完全弄乱了我的标签。因此,我采用了一种更长的方法来确切地了解这种理解产生了什么:

crange = np.arange(0,9)
crangedb = [x + 'dB' for x in str(crange)]
print crange
print crangedb

输出:

[0 1 2 3 4 5 6 7 8]

['[dB', '0dB', ' dB', '1dB', ' dB', '2dB', ' dB', '3dB', ' dB', '4dB', ' dB', '5dB', ' dB', '6dB', ' dB', '7dB', ' dB', '8dB', ']dB']

因此,虽然我的数字列表很好(正如预期的那样),但一旦我尝试使用列表理解将 dB 附加到每个数字,每个值都散布着空白值或括号。从我用 Google 搜索过的每一页来看,我的语法似乎都是正确的,所以我一定是遗漏了一些非常简单或非常小的东西。

您正在将 np.arange 转换为基本上是 "[1 2 3 4...]" 的字符串,然后遍历每个字符。这意味着 x=['[','0',' ',...]。正确的行应该是:

cb.ax.set_yticklabels([str(x) + 'dB' for x in np.arange(0, 9)])

现在您正在将 np.ndarray 的每个项目映射到一个字符串并将其与 'dB' 连接起来。

最好使用 range 而不是 np.arange 来完成该任务:

In [105]: [str(i) + 'dB' for i in range(9)]
Out[105]: ['0dB', '1dB', '2dB', '3dB', '4dB', '5dB', '6dB', '7dB', '8dB']

时间:

In [106]: %timeit [str(i) + 'dB' for i in range(9)]
100000 loops, best of 3: 4.06 us per loop

In [107]: %timeit [str(i) + 'dB' for i in np.arange(0,9)]
10000 loops, best of 3: 28.6 us per loop

无需先将 crange 更改为字符串。当你这样做然后迭代它时,你会得到 list.

的文字字符串表示的每个字符

crange:

[0 1 2 3 4 5 6 7 8]

str(crange):

'[0 1 2 3 4 5 6 7 8]'

crange中的第一个元素是0,但str(crange)中的第一个元素是字符串'['。这会产生您看到的结果。

相反,将 str() 调用移动到 x:

crangedb = [str(x) + 'dB' for x in crange]

这将产生预期的结果。您还可以使用字符串格式:

crangedb = ['{}dB'.format(x) for x in crange]

你可以使用 map:

map(lambda x:"{}db".format(x), change)

使用范围:

map(lambda x:"{}db".format(x), range(0,9))