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

时间:2016-01-15 07:10:28

标签: python python-2.7 list-comprehension

我现在已经挣扎了好几个小时了。我想要做的是产生一个包含" 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搜索过的每一页都是正确的,所以我必须遗漏超级简单或超小的东西。

4 个答案:

答案 0 :(得分:2)

您正在将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'连接。

答案 1 :(得分:2)

最好使用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

答案 2 :(得分:2)

首先无需将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]

答案 3 :(得分:0)

您可以使用map

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

使用范围:

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