所以我有一个单词和数字列表,我试图使用for循环和范围函数来删除数字,以便我只保留单词,如下面的格式所示;
# This is a sample of elements in the list:
billboard_artists = ['The Chainsmokers Featuring Halsey', '6', '1', '3', '6', '1', '3', 'Sia Featuring Sean Paul', '1', '1', '27', '1', '1', '27', 'Major Lazer Featuring Justin Bieber & MO', '2', '2', '4', '2', '2', '4', 'twenty one pilots', '4', '4', '9', '4', '4', '9', 'Calvin Harris Featuring Rihanna']
for item in billboard_artists:
try:
for num in range(100):
if int(item) == num:
billboard_artists.remove(item)
except ValueError:
print(item)
print(billboard_artists)
预期的结果是得到一个只包含歌曲的完整列表。然而,循环只适用于前56个元素左右,然后一些数字开始再次出现:
# ['The Chainsmokers Featuring Halsey', 'Sia Featuring Sean Paul', 'Major Lazer Featuring Justin Bieber & MO', 'twenty one pilots', 'Calvin Harris Featuring Rihanna', 'twenty one pilots', 'Drake Featuring WizKid & Kyla', 'The Chainsmokers Featuring Daya', '3', 'Justin Timberlake', '1', '1', 'Adele', 'Rihanna']
列表中的名称将在使用Spotify Restful API制作播放列表时使用。
在注意到这个问题之后,我使用了一个不同的解决方案,使用ValueError异常来创建一个不同的艺术家列表。
my_list = []
for item in billboard_artists:
try:
for num in range(100):
if int(item) == num:
billboard_artists.remove(item)
except ValueError:
my_list.append(item)
它最终只返回单词而不返回数字的完整列表。(我猜任务完成了)
然而,它仍然困扰我为什么RANGE函数在几次迭代(60左右)后就崩溃了。任何可能的解释,作者都将非常感激。
我认为有许多原因可能会影响您的输出。一个是列表的大小随着你的迭代而变化(你在遍历列表时从列表中删除了项目)。但似乎因为你的第二个实现工作,这不是一个大问题,在这种情况下。
我能想到的另一个原因是,在你的列表中,item
将是"1"
。有很多"我"的例子。在你的列表中,官方文档说list.remove()
删除列表中第一个遇到该值的项目。但是,如果列表的大小在您试图删除时发生变化,则可能会跳过某些项。
最后,这不是您可以实现的最佳方式,对于列表中的每个项目,您要在另一个列表上迭代100次,然后在此之上,list.remove()
每次也要迭代整个列表-使其非常低效。你真的不需要担心这个,你可以这样重写你的函数:
my_list = [item for item in billboard_artists if not item.isnumeric()]
在这个实现中,你没有从billboard_artists
列表中删除任何东西,所以你不会有任何不稳定的行为!它只遍历一次billboards_artists
列表:)