[英]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.