列表理解+产品()组合的“更简单”方法

2024-05-18 23:43:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本混合了字符串和列表的字典:

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'}]

我试着用一个传统的循环来编写它,以保持代码的简单性,以便以后进行修改或修复错误,但是我无法找到一种能够访问所有必需的嵌套变量的方法

结果是使用了几个相对复杂的列表理解:

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的争论,但如果可以的话,试着忽略这一点


Tags: sample方法字符串textinref列表for
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)]

那么理解就是地图

我还建议测试值是否是列表而不是字符串,因为这将允许值是列表以外的任何类型,并且不会被迭代。这也允许将列表的子类型视为列表

要么你的问题中遗漏了什么,要么你忽略了显而易见的问题:

>>> 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}]

相关问题 更多 >

    热门问题