Python 列表理解产生结果加上胡言乱语

Python 列表理解产生结果加上胡言乱语,python,python-2.7,list-comprehension,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”的数字(即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附加到每个数字,每个值都会穿插在空白值或括号中。我在谷歌搜索过的每一页上的语法似乎都是正确的,所以我肯定遗漏了一些非常简单或非常小的东西。

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

对于该任务,最好使用
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

无需先将
字串
更改为字符串。当您这样做,然后对其进行迭代时,您将获得该
列表
的文字字符串表示形式的每个字符

起重机

[0 1 2 3 4 5 6 7 8]
'[0 1 2 3 4 5 6 7 8]'
str(起重机)

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

相反,在
x
周围移动
str()
调用:

crangedb = [str(x) + 'dB' for x in crange]
这将产生所需的结果。您还可以使用字符串格式:

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

无需先将
字串
更改为字符串。当您这样做,然后对其进行迭代时,您将获得该
列表
的文字字符串表示形式的每个字符

起重机

[0 1 2 3 4 5 6 7 8]
'[0 1 2 3 4 5 6 7 8]'
str(起重机)

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

相反,在
x
周围移动
str()
调用:

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))

您可以使用
map

map(lambda x:"{}db".format(x), change)
使用范围:

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

你的意思是说
str(x)+“dB”代表crange中的x吗?免责声明:我不懂Python。但看起来你是在通过一个字符串
x
,而不是通过
crange
,将其字符串化,然后添加
dB
字符串。你的意思是
str(x)在crange
中用x加上“dB”是偶然的?免责声明:我不懂Python。但看起来你是在通过一个字符串
crange
前进,而不是在
x
通过
crange
前进,对它进行字符串化,然后添加
dB
字符串。谢谢!我是在回家的路上得出这个结论的。我正在工作ried说写str(x)会阻止它变为变量,但我猜不是!str(x)返回一个新的“字符串”并保持变量x不变。谢谢!我是在回家的路上得出这个结论的。我担心写str(x)会阻止它变为变量,但我猜不是!str(x)返回一个新的“字符串”并保持变量x不变。