如何使用字符串元组及其替换来替换列表中的字符串?

时间:2016-05-06 22:53:26

标签: python list replace tuples

我列出了归属于玩家的玩家排名。除此之外,我还有一系列排名元组......

rank_database = [("Unprocessed Rank", "Processed Rank"), ("Unprocessed Rank 2", "Processed Rank 2")]

我想做的是,对于玩家排名列表中的每个项目,通过排名数据库处理它们 - 比如查找和替换。

所以,在更换之前:

player_ranks = ["Unprocessed Rank", "Unprocessed Rank 2"]

更换后:

player_ranks = ["Processed Rank", "Processed Rank 2"]

基本上,我想使用rank_databaseplayer_ranks列表上执行查找和替换操作。

提议的解决方案

我的想法是尝试使用str.replace方法的元组,如下所示......

player_ranks = ["Unprocessed Rank", "Unprocessed Rank 2"]
rank_database = [("Unprocessed Rank", "Processed Rank"), ("Unprocessed Rank 2", "Processed Rank 2")]

for x in player_ranks:
    for y in rank_database:
        print("Changed "+x+" to")
        if x == y[0]:
            player_ranks[x].replace(rank_database[y]) #Line 5
            print (x)
            break
        else:
            continue
print("Finished!")

当我执行代码时,由于("Unprocessed Rank", "Processed Rank")是在rank_database[i]找到的元组,我希望这会有点"注入"元组作为str.replace方法中的替换字符串。

因此,在执行代码时,第5行应该看起来像......

rank.replace(("Unprocessed Rank", "Processed Rank"))

这是一个可能的解决方案,还是这不可能,其他解决方案会更合适吗?这是个人项目,所以我更愿意让自己的解决方案有效。

1 个答案:

答案 0 :(得分:0)

我正在做出这些假设:

  1. 数据库中的“未处理”排名是唯一的,因为否则您将不得不添加一种方法来确定哪个元组是从未处理的排名到处理过的排名的“正确”映射。

  2. 返回新的已处理排名列表与改变原始列表一样好。

  3. 您的数据将很容易适合内存,因为这至少需要数据库已经使用的内存的两倍。

  4. 您的数据库应该存储为dict,或者至少应该转换为您正在进行的工作类型,因为您所做的只是将唯一(?)键映射到值。 dict initializer可以使用您已有的可重复键值对。

    下面,我创建了一个独立的功能来完成这项工作。

    #!/usr/bin/env python3
    
    def process_ranks(player_ranks, rank_database):
        rank_map = dict(rank_database)
        return [rank_map[rank] for rank in player_ranks]
    
    def main():
        # Sample data.
        player_ranks = ['old' + str(n) for n in range(4)]
        # Database contains more rank data than we will use.
        rank_database = [
          ('old' + str(n), 'new' + str(n)) for n in range(40)
          ]
    
        print("Original player ranks:")
        print(player_ranks)
        processed_ranks = process_ranks(player_ranks, rank_database)
        print("Processed player ranks:")
        print(processed_ranks)
        return
    
    if "__main__" == __name__:
        main()
    

    输出:

    Original player ranks:
    ['old0', 'old1', 'old2', 'old3']
    Processed player ranks:
    ['new0', 'new1', 'new2', 'new3']
    

    如果您确实需要改变原始列表,可以使用process_ranks中对main的略有不同的调用替换其内容:

        player_ranks[:] = process_ranks(player_ranks, rank_database)
    

    通常,我发现保留原始列表并创建新的processed_ranks列表更容易编码,尤其是调试。