2017-03-17 30 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

确实 - 你可能想编辑你的问题。 –

相关问题