2016-05-06 22 views
1

私はプレイヤーに帰属する選手のランキングのリストを持っています。これに加えて、私はランクのタプルのリストを持っている...私はやりたい何タプルの文字列とその置換えを使用してリスト内の文字列を置き換えるにはどうすればいいですか?

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"] 

、私はplayer_ranksリストに検索と置換操作を実行するためにrank_databaseを使用したいと思います。

提案された解決策

私の考えでは、("Unprocessed Rank", "Processed Rank")rank_database[i]で発見タプルですので、私は、コードを実行すると

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

...次のようにstr.replace方法でタプルを使用しようとしました私はこれがstr.replaceメソッドの置換文字列としてタプルを「注入」することを期待しています。

コードを実行するときに、5行目は

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

...のようになります。これは、可能な解決策になるか、これは不可能であり、他のソリューションは、より適切であろうか?これは個人的なプロジェクトのためのものですので、私自身の解決策を働かせたいと思っています。

+1

構造を説明するためのサンプルデータを表示できますか?処理された、未処理の、および参照されていない平均は何かが明確ではありません。あなたの背後に 'player_ranks'を変更する別のスレッドがないか、あなたの' __eq__'メソッドで本当に奇妙なことをやったことがない限り、 –

+0

'player_ranksランクは_常にtrueになります。 –

+1

私はあなたの質問が不明であることをAlex Hallに同意します。しかし、if文が常に真であることは明らかです。おそらく、else文がそれより上のif文と同じインデントレベルにあることを意図していること、else:continue構文がこのコードの文脈で重複していること、 + =有効なPython演算子ではありません。 –

答えて

0

私はこれらの仮定を作ってるんだ。そうしないと、どの組を決定するための方法を追加する必要がありますので

  1. 「未処理」は、データベース内のランクは、一意であるさ「正しい」マッピングからは、処理されていないランクが処理されたランクになります。

  2. 処理済みランクの新しいリストを返すことは、元のリストを変更することと同じです。

  3. あなたのデータは、データベースがすでに使用しているメモリの少なくとも2倍のメモリを必要とするため、メモリに簡単に収まるようになります。

データベースは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'] 

あなたが本当に元のリストを変異させる必要がある場合は、あなたとmainprocess_ranksにわずかに異なる呼び出しでその内容を置き換えることができます:

player_ranks[:] = process_ranks(player_ranks, rank_database) 

しかし、一般的には元のリストを保持していて、新しいprocessed_ranksリストを作成する方がコード作成が簡単で、特にデバッグが容易です。

+0

これは明らかに、私がやっていることに夢中になっているのではなく、このすべてに対して最高の(最も単純な)解決策です。私は元のコードを配備しようと思いこんでしまったと思います。私はこれが最後に働くことを忘れています。あなたのご意見ありがとうございます! – mmacheerpuppy

+0

私は合理的に私は信じてプログラミングに新しいです。 – mmacheerpuppy

関連する問題