[英]Selecting Random items from Dictionary of Lists in Python
我試圖從列表字典中隨機選擇特定數量的序列,然后將這些序列附加到新列表中,但我一直收到一個空列表。 我的代碼:
final_List = []
num = [["ENST", "10", "5"], ["ENGT", "8", "2"], ["ENHT", "5", "1"]]
a = {"ENST" : ['acac', 'tgtgtgt', 'hahah'], "ENHT": ['aaaa', 'tttt', 'gig',
'cccc'], 'ENGT' : ['ddd', 'eeee', 'ffff', 'hhhh', 'pppp']}
for line in num:
for k, v in a.items():
if line[0] == k:
for i in int(line[1] -1):
final_List.append([k, random.choice(0, len(v))])
我將 line[0] 與 k 進行比較,如果它們相同,我想從 v 中提取隨機序列。我想要的序列數是 line[1] 處的數字。 final_List 看起來像:
final_List = [["ENST", "acac"], ["ENST", tgtgtgt"]...10 lists with header "ENST"
["ENGT", "ddd"], .....8 lists with header "ENGT"
["ENHT","aaaa"], ..... 5 lists with header "ENHT"
您可以使用嵌套列表理解:
>>> import pprint
>>> import random
>>> num = [["ENST", "10", "5"], ["ENGT", "8", "2"], ["ENHT", "5", "1"]]
>>> a = {"ENST" : ['acac', 'tgtgtgt', 'hahah'], "ENHT": ['aaaa', 'tttt', 'gig',
... 'cccc'], 'ENGT' : ['ddd', 'eeee', 'ffff', 'hhhh', 'pppp']}
>>> res = [[[k, random.choice(a[k])] for _ in range(int(count))] for k, count, _ in num]
>>> pprint.pprint(res)
[[['ENST', 'acac'],
['ENST', 'tgtgtgt'],
['ENST', 'hahah'],
['ENST', 'hahah'],
['ENST', 'tgtgtgt'],
['ENST', 'tgtgtgt'],
['ENST', 'hahah'],
['ENST', 'acac'],
['ENST', 'acac'],
['ENST', 'tgtgtgt']],
[['ENGT', 'pppp'],
['ENGT', 'ffff'],
['ENGT', 'eeee'],
['ENGT', 'hhhh'],
['ENGT', 'pppp'],
['ENGT', 'eeee'],
['ENGT', 'pppp'],
['ENGT', 'pppp']],
[['ENHT', 'cccc'],
['ENHT', 'aaaa'],
['ENHT', 'gig'],
['ENHT', 'tttt'],
['ENHT', 'cccc']]]
在上面for k, count, _ in num
將迭代num
元素並將它們解包到相應的變量。 請注意,我們只需要名稱和計數,因此一次性變量被命名為_
:
>>> [(k, count) for k, count, _ in num]
[('ENST', '10'), ('ENGT', '8'), ('ENHT', '5')]
對於中的每個元素num
列表是通過選擇構成count
從相應列表元素在a
與random.choice
:
>>> k = 'ENST'
>>> count = '10'
>>> [[k, random.choice(a[k])] for _ in range(int(count))]
[['ENST', 'tgtgtgt'], ['ENST', 'hahah'], ['ENST', 'acac'], ['ENST', 'hahah'], ['ENST', 'tgtgtgt'], ['ENST', 'hahah'], ['ENST', 'hahah'], ['ENST', 'hahah'], ['ENST', 'acac'], ['ENST', 'acac']]
問題在於您做出隨機選擇的那一行。 您錯誤地使用了random.choice
。 此外,我們希望確保您正確地迭代 line[1]。 線路:
for i in int(line[1] -1):
final_List.append([k, random.choice(0, len(v))])
應該
for i in range(int(line[1])):
final_List.append([k, random.choice(v)])
類似於列表理解的想法,但我會使用一個函數讓它更清晰一點
def create_sequence(hdr, count):
return [[hdr, random.choice(a[hdr])] for _ in range(count)]
final_list = [create_sequence(hdr, int(count)) for hdr,count,_ in num]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.