列表理解产生结果加上乱码
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))
我已经为此苦苦挣扎了几个小时。我想要做的是生成一个列表,其中包含数字后跟 "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))