我有以下字典:從字典結合所有可能的選項
d = {
'option1': range(0, 5),
'optionA': ['a', 'b', 'c'],
'extra_option': range(100, 200, 20)
}
我在尋找的代碼,會爲我提供一個數組,像這樣:
[ "--option1=0 --optionA=a --extra_option=100",
"--option1=0 --optionA=a --extra_option=120",
"--option1=0 --optionA=a --extra_option=140",
.
.
.
"--option1=5 --optionA=b --extra_option=180"]
我已經看了在itertools產品和組合中,但兩者似乎都不適合這項工作。我想創建這樣一個發電機:
def get_options(d, keys):
key = keys.pop()
for key in d:
if len(keys) > 0:
for value in d[key]:
for other in get_options(d, keys[:]):
yield "--%s=%s %s" % (key, value, other)
else:
for value in d[key]:
yield "--%s=%s" % (key, value)
for x in get_options(d, list(d.keys())):
print (x)
但是,這給我的錯誤:
$ python3 test.py
--optionA=a --optionA=a --optionA=a
--optionA=a --optionA=a --optionA=b
--optionA=a --optionA=a --optionA=c
--optionA=a --optionA=a --option1=0
--optionA=a --optionA=a --option1=1
--optionA=a --optionA=a --option1=2
--optionA=a --optionA=a --option1=3
--optionA=a --optionA=a --option1=4
--optionA=a --optionA=a --extra_option=100
--optionA=a --optionA=a --extra_option=120
--optionA=a --optionA=a --extra_option=140
--optionA=a --optionA=a --extra_option=160
--optionA=a --optionA=a --extra_option=180
Traceback (most recent call last):
File "test.py", line 18, in <module>
for x in get_options(d, list(d.keys())):
File "test.py", line 12, in get_options
for other in get_options(d, keys):
File "test.py", line 12, in get_options
for other in get_options(d, keys):
File "test.py", line 8, in get_options
key = keys.pop()
IndexError: pop from empty list
這不是我所期待的......我在做什麼錯?任何人都可以告訴我一個更好的方法來做到這一點?提前致謝!
編輯10秒後:
哎呀,所以我還是不得不在那裏for key in d
從以前的測試...去除(和取消縮進休息了一下),它的工作原理!但我的其他問題仍然存在,有沒有更好的方法來做到這一點?
,如果你有工作,但要改善它,考慮http://codereview.stackexchange.com – davedwards