簡體   English   中英

如何從字典內的隨機列表中選擇隨機項目

[英]How to pick random item from random list inside a dictionary

所以我在從字典中的隨機列表中獲取隨機項目時遇到了麻煩。 我現在擁有的代碼

tasktotal = ["Medbay/Submit Scan","Medbay/Submit Example","Cafeteria/Connect Wire","Electrical/Connect Wire","Cafeteria/Empty Garbage","Security/Connect Wire","Navigation/Navigate","Upper Engine/Fuel","Lower Engine/Fuel","Shield/Prime Shield","Storage/Empty Garbage","Admin/Swipe Card","Weapon/Clear Asteroid","Admin/Connect Wire","Storage/Connect Wire"]

然后我做了

task = dict(s.split('/') for s in task)

這樣做的問題是我只能在一個位置執行一項任務。 我想在字典中列出它,並從隨機位置選擇一個隨機任務。

您可以制作一個字典,將鍵映射到這樣的列表(或者您可以使用defaultDict ):

tasktotal = ["Medbay/Submit Scan","Medbay/Submit Example","Cafeteria/Connect Wire","Electrical/Connect Wire","Cafeteria/Empty Garbage","Security/Connect Wire","Navigation/Navigate","Upper Engine/Fuel","Lower Engine/Fuel","Shield/Prime Shield","Storage/Empty Garbage","Admin/Swipe Card","Weapon/Clear Asteroid","Admin/Connect Wire","Storage/Connect Wire"]

d = {}
for k, v in (s.split('/') for s in tasktotal):
    d.setdefault(k, []).append(v)

這將使d看起來像:

{'Medbay': ['Submit Scan', 'Submit Example'],
 'Cafeteria': ['Connect Wire', 'Empty Garbage'],
 'Electrical': ['Connect Wire'],
 'Security': ['Connect Wire'],
 'Navigation': ['Navigate'],
 'Upper Engine': ['Fuel'],
 'Lower Engine': ['Fuel'],
 'Shield': ['Prime Shield'],
 'Storage': ['Empty Garbage', 'Connect Wire'],
 'Admin': ['Swipe Card', 'Connect Wire'],
 'Weapon': ['Clear Asteroid']}

鑒於您可以從您喜歡的任何列表中獲取隨機值:

import random

random.choice(d['Medbay'])
# 'Submit Example' (or 'Submit Scan')

首先你需要創建一個字典。 鍵是唯一的,如果要在一個鍵下存儲多個值,請將列表存儲為值。 然后從中抽取:

tasktotal = ["Medbay/Submit Scan","Medbay/Submit Example","Cafeteria/Connect Wire",
             "Electrical/Connect Wire","Cafeteria/Empty Garbage",
             "Security/Connect Wire","Navigation/Navigate",
             "Upper Engine/Fuel","Lower Engine/Fuel","Shield/Prime Shield",
             "Storage/Empty Garbage","Admin/Swipe Card","Weapon/Clear Asteroid",
             "Admin/Connect Wire","Storage/Connect Wire"]

# import defaultdict
# d = defaultdict(list) 
# instead of d={} and then simply use d[key].append(...) it creates
# the list itself

data = {}
for task in tasktotal:
    key, value = task.split("/") 
    # either use plain dict and test key yourself
    if key in data:
        data[key].append(value)
    else:
        data[key] = [value]

    # or use setdefault 
    # d.setdefault(key,[]).append(value)

    # or  
    # d[key].append(...) with defaultdict(list)

print(data)

然后隨機查詢:

import random
# random key/value-list pair
key,values = random.choice(list(data.items()))
# random item from value-list
print(key, "->",  random.choice(values)) 

輸出:

'edbay': ['Submit Scan', 'Submit Example'], 
'Cafeteria': ['Connect Wire', 'Empty Garbage'], 
'Electrical': ['Connect Wire'], 'Security': ['Connect Wire'], 
'Navigation': ['Navigate'], 'Upper Engine': ['Fuel'], 
'Lower Engine': ['Fuel'], 'Shield': ['Prime Shield'], 
'Storage': ['Empty Garbage', 'Connect Wire'], 
'Admin': ['Swipe Card', 'Connect Wire'], 'Weapon': ['Clear Asteroid']}


Lower Engine -> Fuel

你可以結合這兩個問題的答案來自我回答你的問題:

你可以使用itertools.groupby

請注意,您提供給groupby的可迭代對象應該按照您用於分組的相同鍵進行排序,但在您的情況下,這是一個簡單的排序......

In [12]: from itertools import groupby 
    ...: data = ["Medbay/Submit Scan","Medbay/Submit Example","Cafeteria/Connect Wire","Electrical/Connect Wire","Cafeteria/Empty Garbage","Security/Connect Wire","Navigation/Navigate","Upper Engine/Fuel","Lower Engine/Fuel","Shield/Prime Shield","Storage/Empty Garbage","Admin/Swipe Card","Weapon/Clear Asteroid","Admin/Connect Wire","Storage/Connect Wire"] 
    ...: data.sort() 
    ...: {k:list(s[1] for s in g) 
    ...:     for k, g in groupby((s.split('/') for s in data), lambda s:s[0])}    
Out[12]: 
{'Admin': ['Connect Wire', 'Swipe Card'],
 'Cafeteria': ['Connect Wire', 'Empty Garbage'],
 'Electrical': ['Connect Wire'],
 'Lower Engine': ['Fuel'],
 'Medbay': ['Submit Example', 'Submit Scan'],
 'Navigation': ['Navigate'],
 'Security': ['Connect Wire'],
 'Shield': ['Prime Shield'],
 'Storage': ['Connect Wire', 'Empty Garbage'],
 'Upper Engine': ['Fuel'],
 'Weapon': ['Clear Asteroid']}

In [13]: d = _                                                                                             

In [14]: from random import choice                                                                   

In [15]: rk = choice(list(d.keys()))                                                                 

In [16]: rk                                                                                          
Out[16]: 'Lower Engine'

In [17]: choice(d[rk])                                                                               
Out[17]: 'Fuel'

以它的方式,優雅……

convert your code to dic to get value by key 

tasktotal = ["Medbay/Submit Scan","Medbay/Submit Example","Cafeteria/Connect 
Wire","Electrical/Connect Wire","Cafeteria/Empty Garbage",
"Security/Connect Wire","Navigation/Navigate","Upper Engine/Fuel","Lower 
Engine/Fuel","Shield/Prime Shield",
"Storage/Empty Garbage","Admin/Swipe Card","Weapon/Clear Asteroid","Admin/Connect 
Wire","Storage/Connect Wire"]

dic = {}
key = 0
for i in tasktotal:
i = i.split('/')
dic[key] = i[0]
key+=1
dic[key] = i[1]
key+=1
print(dic)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM