2017-03-17 29 views
1

我有一個字符串和列表的搭配詞典:「更簡單」的方法來這個list解析+產品()組合

sample_dict = {'numbers': [1, 2, 3], 'ref': 'some text'} 

目標是結合和「扁平化」成個人字典的迭代這將被通過芹菜作爲參數一組的計劃任務:

# end goal: 
[{'numbers': 1, 'ref': 'some text'}, 
{'numbers': 2, 'ref': 'some text'}, 
{'numbers': 3, 'ref': 'some text'}] 

我試圖用傳統的循環來保持代碼的簡潔供以後適應或bugfixing寫的,但我不能工作了方式可以訪問所有必要的嵌套變量。

結果是使用幾個相對複雜的列表內涵:所以

raw_vals = [[(i,v)] if isinstance(v,str) else ([(i,b) for b in v]) for i,v in sample_dict.items()] 
end_goal = [dict(i) for i in product(*raw_vals)] 

問:有沒有更詳細的,但可能不太神祕的方式來獲得相同的結果,使用標準的循環或類似的?我知道這可能會引發關於可讀性與LOC的爭論,但如果可以的話,儘量忽略它。

+1

'有沒有更詳細的,但可能不太神祕的方式來獲得相同的結果,使用標準的循環或類似'當然?有,你總是可以在for循環中做到這一點。 – Netwave

+0

我曾嘗試@DanielSanchez,但無法解決如何一次訪問主字典中的每個項目。例如,如果您遍歷每個鍵,那麼您一次只能訪問一個鍵,而無法返回合併的詞典。如果您可以回覆考慮的解決方案,我很樂意。 –

回答

2

我建議分解出的條件列全國第一:

def assoc(i, v): 
    if isinstance(v, list): 
     return [(i, b) for b in v] 
    return [(i, v)] 

raw_vals = [assoc(i, v) for i, v in sample_dict.items())] 
end_goal = [dict(i) for i in product(*raw_vals)] 

然後內涵是地圖。

我也可能會建議測試,如果該值是一個列表而不是一個字符串,因爲這將允許值是除列表之外的任何類型並且不被迭代。這也將允許列表的子類型被視爲列表。

+0

謝謝@Dan-D - 這確實簡化了第一個列表理解。 –

0

無論有什麼東西從你的問題丟失或你忽略了很明顯的:

>>> sample_dict = {'numbers': [1, 2, 3], 'ref': 'some text'} 
>>> flattened = [{'numbers': num, 'ref': sample_dict['ref']} for num in  sample_dict['numbers']] 
>>> print flattened 
[{'ref': 'some text', 'numbers': 1}, {'ref': 'some text', 'numbers': 2}, {'ref': 'some text', 'numbers': 3}] 
+0

感謝布魯諾 - 我喜歡這個想法,但在我的情況下,鍵的名稱會有所不同,因此他們需要被抽象化。應該在問題中提到這一點。 –

+0

確實 - 你可能想編輯你的問題。 –

相關問題