>>> from itertools import product, starmap
>>> d={'s1':{'a':[1,2,3],'b':[4,5,6]},'s2':{'d':[77,88,99],'e':[666,333,444]}}
>>> for k,v in sorted(d.items()): # use d.iteritems for py2
for x,y in zip(*starmap(product,sorted(v.items()))):
print k
print '{0},{1}'.format(*x)
print '{0},{1}'.format(*y)
print k
print
s1
a,1
b,4
s1
s1
a,2
b,5
s1
s1
a,3
b,6
s1
s2
d,77
e,666
s2
s2
d,88
e,333
s2
s2
d,99
e,444
s2
說明
它獲得與t的值對字典中的每個列表的他鍵,以便
{'a':[1,2,3],'b':[4,5,6]}
變成
[(('a', 1), ('b', 4)), (('a', 2), ('b', 5)), (('a', 3), ('b', 6))]
這裏是如何做到這一點:
第一線經過在d
每個鍵和值。這些都必須進行排序,所以我可以按升序進行迭代,因爲字典沒有訂單。
該鍵的值是一個像下面這樣的字典,它按照鍵值對的元組進行排序。
d = {'a':[1,2,3],'b':[4,5,6]}
>>> sorted(d.items())
[('a', [1, 2, 3]), ('b', [4, 5, 6])]
然後product
用於獲取與每一個值配對的關鍵。
>>> [product(*x) for x in sorted(d.items())]
# iterates through [('a', 1), ('a', 2), ('a', 3)], [('b', 4), ('b', 5), ('b', 6)]
這可以更簡單地使用starmap
,這是建像map
雖然該函數的參數(在這種情況下product
)進來的元組被寫入。見doc
>>> starmap(product,sorted(d.items()))
# iterates through [('a', 1), ('a', 2), ('a', 3)], [('b', 4), ('b', 5), ('b', 6)]
然後名單zippped
在一起。
>>> zip(*starmap(product,sorted(d.items())))
[(('a', 1), ('b', 4)), (('a', 2), ('b', 5)), (('a', 3), ('b', 6))]
你試過了什麼?你有沒有嘗試過什麼? –
這個數據結構是否正確? – jdi
這不是'dict'。我假設它應該是這樣的,所以我會編輯它:'d = {'s1':{'a':[1,2,3],'b':[4,5,6]},'s2' :{'d':[77,88,99],'e':[666,333,444]}}' – jamylak