2016-11-18 106 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的,所以對如何做任何建議,這更雄辯地將不勝感激

安美居,我想要做的是一個隨機值添加到每個當代碼在數據中循環時生成密鑰。

那麼,它說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中的「內部」列表更改爲「namedtuple」。甚至將他們推廣到全班,然後在該班的方法中實施一些邏輯。 –

回答

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]可以是相同的(如果他們不是idk爲什麼你需要一個隨機值附加)。

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))'''然後使用'''for i,each_list枚舉(數據)'''在迭代時使用枚舉來爲列表建立索引 - '''key = each_list [0] .replace('。','')+ str(n_s [i])''' – wwii