python - 在 Python 中重构 For 循环

标签 python python-3.x refactoring control-flow

我目前正在开发一个 iTunes 数据程序,该程序不断循环浏览用户的图书馆,以获取有关某个图书馆的统计信息。 返回 我有一些这样的代码片段:

def numArtist(self):
    num = 0
    for song in self.allSongs:
        tempList = []
        if song.artist not in tempList:
            tempList.append(song.artist)
            num += 1
    return num

def getAlbumNames(self):
    albums = []
    for song in self.allSongs:
        if song.album not in albums:
            albums.append(song.album)
    return albums

重复主要 for 循环体的地方:

  for song in self.allSongs: # same for-loop condition
       # different for-loop body 

有没有办法重构像这样的方法,我有相同的 for 循环条件但主体定义不同?

我有很多方法都使用相同的 for 循环,所以我想找到一种方法来降低代码的复杂性和冗余。


仅供引用,所有 Song 对象都有我用来获取数据的属性 - 艺术家、专辑(名称)、流派等。

最佳答案

使用set comprehensionslen 来简化它们中的每一个:

def numArtist(self):
    return len({song.artist for song in self.allSongs})

def getAlbumNames(self):
    return {song.album for song in self.allSongs}

为了让它更通用,您可以编写一个方法,它接受 lambda并使用它来过滤每首歌曲的属性:

def uniqueProps(self, fxn):
    return {fxn(song) for song in self.allSongs}

def getAlbumNames(self):
    return self.uniqueProps(lambda song: song.album)

关于python - 在 Python 中重构 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40695241/

相关文章:

python - 如何确定Mac上Anaconda是否已完全安装?

python3.3 matplotlib无法导入名称_tkagg

python - 我无法从 Django 中的模板访问相关字段,但它可以在 shell 中工作,我做错了什么?

python - 参数 (n_neighbors) 的参数值需要是一个序列

mysql - PostgreSQL 多个 CSV 导入并向每列添加文件名

java - 你能在java中用一个变化的变量调用不同的方法吗?

java - 我应该如何正确地将Java加密算法移植到Python?

python - 处理复数和numpy时如何在python中正确指定dtype?

php - 对新项目和编辑项目使用 REPLACE INTO?

refactoring - 开发人员周转率高的项目真的是一件坏事吗?