我有一本字典,其中包含int,bool,字符串和列表中的值,以及一个排序的键列表,在其中需要列表的最终列表。 我想要这样的输出,即在哪里有列表,我们将其与单个值组合在一起。
输入:
cols = ['region', 'city', 'country', 'valid']
vals = {'city': [10, 20], 'valid': True, 'region': 3, 'country': 'US'}
输出:
[[3, 10, 'US', True], [3, 20, 'US', True]]
现在,如果另一个字段是列表,则会增加组合。
输入:
cols = ['region', 'city', 'country', 'valid']
vals = {'city': [10, 20], 'valid': True, 'region': [3, 4], 'country': 'US'}
输出:
[[3, 10, 'US', True], [3, 20, 'US', True], [4, 10, 'US', True], [4, 20, 'US', True]]
寻找实现这一目标的最pythonic方法。
答案 0 :(得分:3)
import itertools
cols = ['region', 'city', 'country', 'valid']
vals = {'city': [10, 20], 'valid': True, 'region': [3, 4], 'country': 'US'}
values = [vals[key] for key in cols]
values = [val if isinstance(val, list) else [val] for val in values]
result = list(itertools.product(*values))
print(result)
# [(3, 10, 'US', True), (3, 20, 'US', True), (4, 10, 'US', True), (4, 20, 'US', True)]
相关阅读:
*values
在itertools.product(*values)
中做什么)答案 1 :(得分:2)
您可以将itertools.product
用于各个字段,例如
但是在执行product
之前,您需要检查它是否为int
或str
的实例,如果是,则将其转换为list
或{ {1}}是为了进行正确的迭代
tuple
您可以编写一个函数来处理类似的事情,
>>> vals = {'city': [10, 20], 'valid': True, 'region': 3, 'country': 'US'}
>>>
>>> city = vals['city']
>>> region = vals['region']
>>> country = vals['country']
>>>
>>> if not isinstance(region, (list, tuple)):
... region = [region]
...
>>> if not isinstance(country, (list, tuple)):
... country = [country]
...
>>> list(product(region, city, country, [vals['valid']]))
[(3, 10, 'US', True), (3, 20, 'US', True)]
>>> vals
{'city': [10, 20], 'valid': True, 'region': [3, 4], 'country': 'US'}
>>> from itertools import product
>>> list(product(vals['region'], vals['city'], [vals['country']], [vals['valid']]))
[(3, 10, 'US', True), (3, 20, 'US', True), (4, 10, 'US', True), (4, 20, 'US', True)]
输出:
$ cat mkcomb.py
from itertools import product
def mk_comb(keys, vals):
values = [
vals[key] if isinstance(vals[key], (list, tuple)) else [vals[key]]
for key in keys
]
return list(product(*values))
cols = ['region', 'city', 'country', 'valid']
vals1 = {'city': [10, 20], 'valid': True, 'region': 3, 'country': 'US'}
vals2 = {'city': [10, 20], 'valid': True, 'region': [3, 4], 'country': 'US'}
print(mk_comb(cols, vals1))
print(mk_comb(cols, vals2))
答案 2 :(得分:0)
列表理解可以为您完成这项工作:
list(itertools.product(*[vals[c] if type(vals[c]) == list else [vals[c]] for c in cols]))