将字符串和列表字典转换为列表列表

时间:2019-10-09 08:47:30

标签: python

我有一本字典,其中包含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方法。

3 个答案:

答案 0 :(得分:3)

使用itertools.product

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

相关阅读:

答案 1 :(得分:2)

您可以将itertools.product用于各个字段,例如

但是在执行product之前,您需要检查它是否为intstr的实例,如果是,则将其转换为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]))