2016-11-18 6 views
1

次のコードをリスト上で繰り返し、データを使って辞書を作成します。辞書の値を繰り返しながら変更する

self.data = [["name1.co.uk", "123", "A", "1.2.3.4"],["name2.com", "122", "NS", "ns1.google.com"]] 

for each_list in self.data: 
      self.terrarecord[each_list[0].replace('.', '')] = { 
       "zone_id": self.zone_id, 
       "name": each_list[0] + self.url, # not sure if I need to do this 
       "type": each_list[2], 
       "ttl": each_list[1], 
       "records": [each_list[3].replace('\n', '')] 
      } 

私はこれはおそらく非常にPython的ではありません実現し、これを行う方法上の任意の提案は、このより雄弁に、私はそれぞれにランダムな値を追加されて何をしたいのか

Anyhooを、高く評価されるだろうコードがデータをループする際に生成されるキー。

だから私は、完成した結果は次のようなものに見えるかもしれませんので、最後にランダムに生成された番号を追加する場所、それがself.terrarecord[each_list[0].replace('.', '')] = {を言う:あなたはそれと同じを使用しているループの中で見ることができるように

"key123" { # <-- This is the key that needs a random number 
    "id": "id", 
    "name": "key.co.uk", 
    "type": "SOA", 
    "records": ["1234 etc"] 

} 

dataリスト内のデータに複数のキーを設定する必要があります。最初のものはユニークである必要があります。なぜループスルーするときに整数を追加する必要があるのですか。

これは意味があると思います。説明するのは非常に難しいです。

おかげで、このようなものについてはどのように

+0

「self.data」には何がありますか? 'each_list'の構成は何ですか? – depperm

+0

申し訳ありませんが、例が追加されました。 –

+0

self.dataの 'internal'リストを代わりに 'namedtuple'sに変更することが1つ改善されるかもしれません。あるいは、クラスをフルクラスに昇格させてから、そのクラスのメソッドにロジックの一部を実装します。 –

答えて

0

import random 

... 
rand_key = random.randint(1, 100) 

self.terrarecord[each_list[0].replace('.', '') + str(rand_key)] = { 
... 
} 

あなたは乱数がrandint()に引数を指定してから選択したい範囲を調整することができます。しかし、これにより、dictの値にアクセスすることは困難になります。

また、each_list[0].replace('.', '')rand_keyが以前のキーと同じ値を持つ場合、データを上書きする可能性があります。これが問題でない場合は、この方法が有効です。それがある場合は、タイムスタンプを使用して「ランダム」番号を生成することがありました:

from datetime import datetime 

rand_key = datetime.now().strftime('%Y%m%d%s%f') 

each_list[0].replace('.', '')の同じ値が同じマイクロ秒で二回まで来ていない限り、あなたに一意のキーを与えるべきです。 strftime()に渡されるフォーマットコードについては、http://strftime.org/を参照してください。

+0

これは完璧です、ありがとう! –

0

ランダム値を得るにはrandintを使用しますが、each_list[0]が同じである場合には、乱数が使用されていないことを確認してください追加された値)。

from random import randint 

data = [["name1.co.uk", "123", "A", "1.2.3.4"],["name2.com", "122", "NS", "ns1.google.com"]] 
terrarecord={} 

def getRandKey(name,record,key_length=3): 
    min=int('1'+'0'*(key_length-1)) 
    max=int('9'*key_length) 
    r=randint(min,max) 
    new_name=name+str(r) 
    while new_name in record: 
    r=randint(min,max) 
    new_name=name+str(r) 
    return new_name 

for each_list in data: 
    terrarecord[getRandKey(each_list[0].replace('.', ''),terrarecord)] = { 
       "zone_id": 5, 
       "name": each_list[0], 
       "type": each_list[2], 
       "ttl": each_list[1], 
       "records": [each_list[3].replace('\n', '')] 
    } 
+0

また、ランダムなリストを作成することもできます - '' 'n_s = random.sample(list(range(len(data)* 5))、len(data))' ''次にiに '' '、列挙でeach_list列挙型を反復して使用してリストを索引付けするときに ''(data) '' 'を使用します - ' 'key = each_list [0] .replace( '。'、 '')+ str(n_s [i])' '' – wwii

関連する問題