Python 将目录列表转换为目录列表

Python 将目录列表转换为目录列表,python,list,dictionary,zip,Python,List,Dictionary,Zip,我有一本这样的字典: { "var1": [0, 1], "var2": ["foo", "bar"] } 鉴于上述情况,我想最后列出一系列字典,如下所示: [ { "var1_0_var2_foo": {"var1": 0, "var2": "foo"} }, { "var1_1_var2_b

我有一本这样的字典:

{
    "var1": [0, 1],
    "var2": ["foo", "bar"]
}
鉴于上述情况,我想最后列出一系列字典,如下所示:

[
    { "var1_0_var2_foo": {"var1": 0, "var2": "foo"} },
    { "var1_1_var2_bar": {"var1": 1, "var2": "bar"} }
]
原始字典中每个列表中的键和元素的数量是可变的,可以是任何内容

这是我的一个看起来很凌乱但很有效的解决方案:

source = {
    'x': ['a', 'b'],
    'y': [0, 1],
    'z': ['foo', 'bar']
}

target = []


names = list(source.keys())
lists = list(source.values())
zipped = list(zip(*lists))

for item in zipped:
    full_name = ""
    full_dict = {}
    for idx, value in enumerate(item):
        full_name += f"{names[idx]}_{value}_"
        full_dict[names[idx]] = value
    full_name = full_name.rstrip('_')
    target.append({full_name: full_dict})

print(target)
输出:

[
    {'x_a_y_0_z_foo': {'x': 'a', 'y': 0, 'z': 'foo'}}, 
    {'x_b_y_1_z_bar': {'x': 'b', 'y': 1, 'z': 'bar'}}
]

上面的方法很有效,但我想知道是否有更好的优雅的python方法来实现这一点?

我不明白为什么输出列表中有外部dict为什么不只是一个dict输出列表:

data = {
'var1': [0, 1],
'var2': ["foo", "bar"]}

output = [dict(zip(data, vars)) for vars in zip(*data.values())]

我不明白输出列表中外部dict的原因为何不只是dict输出列表:

data = {
'var1': [0, 1],
'var2': ["foo", "bar"]}

output = [dict(zip(data, vars)) for vars in zip(*data.values())]
输出

[{'x_a_y_0_z_foo': {'x': 'a', 'y': 0, 'z': 'foo'}},
 {'x_b_y_1_z_bar': {'x': 'b', 'y': 1, 'z': 'bar'}}]
输出

[{'x_a_y_0_z_foo': {'x': 'a', 'y': 0, 'z': 'foo'}},
 {'x_b_y_1_z_bar': {'x': 'b', 'y': 1, 'z': 'bar'}}]

下面是一个pythonic方法,可以通过列表理解和lambda函数实现这一点-

d = {
    'x': ['a', 'b'],
    'y': [0, 1],
    'z': ['foo', 'bar']
}

f = lambda x: {i:j for i,j in zip(d,x)}  #Creates the values of final output
g = lambda x: '_'.join([str(j) for i in zip(d,x) for j in i])  #Creates the keys of final output

target = [{g(i):f(i)} for i in zip(*d.values())]
print(target)

下面是一个pythonic方法,可以通过列表理解和lambda函数实现这一点-

d = {
    'x': ['a', 'b'],
    'y': [0, 1],
    'z': ['foo', 'bar']
}

f = lambda x: {i:j for i,j in zip(d,x)}  #Creates the values of final output
g = lambda x: '_'.join([str(j) for i in zip(d,x) for j in i])  #Creates the keys of final output

target = [{g(i):f(i)} for i in zip(*d.values())]
print(target)

想要以字典列表结束您提供的列表无效,因为它具有字典声明语法您正在指定var1_0_var2_foo:这仅在dicts中请使用有效代码编辑您的问题。抱歉,固定语法。希望以词典列表结束。您提供的列表无效,因为它具有词典声明语法。您正在指定var1\u 0\u var2\u foo:这仅在dicts中。请使用有效代码编辑您的问题。抱歉,固定语法。可能不是OP要求的,但显然是将原始字典转换为列表的更符合逻辑的方法。预期输出中的键意义不大,不太可能有任何用处。也许looking OP是在寻找一个文件名模式来存储JSON数据?没错,如果不需要那个愚蠢的键名,那将是一个简单得多的问题。我需要这些键是因为一个特定的不可避免的原因。这可能不是OP要求的,但显然是将原始字典转换为列表的更合理的方式。预期输出中的键意义不大,不太可能有任何用处。也许looking OP是在寻找一个文件名模式来存储JSON数据?没错,如果不需要那个愚蠢的键名,那将是一个简单得多的问题。我需要一个特定的不可避免的原因的关键。选择这个作为答案,因为它避免任何进口!很好的代码。很高兴随时提供帮助。讽刺的是,当代码违反PEP8建议时,这里是pythonic方式:始终使用def语句,而不是将lambda表达式直接绑定到标识符的赋值语句。第一种形式表示结果函数对象的名称是“f”,而不是泛型。这通常对于回溯和字符串表示更有用。赋值语句的使用消除了lambda表达式相对于显式def语句所能提供的唯一好处,即它可以嵌入到更大的表达式中。讽刺的是,引用PEP8,第一段本身明确声明:正如PEP 20所说,可读性很重要。风格指南是关于一致性的。与本风格指南保持一致非常重要。项目内的一致性更为重要。一个模块或功能内的一致性是最重要的。但是,要知道什么时候应该前后不一致——有时候风格指南的建议根本不适用。当有疑问时,运用你的最佳判断。抱歉,我无意冒犯您:虽然我确实了解您的来历,但从可读性的角度来看,我更喜欢使用lambda函数进行1行返回。起初我把所有的代码塞进了一行,但这看起来很糟糕!选择这个作为答案,因为它避免了任何导入!很好的代码。很高兴随时提供帮助。讽刺的是,当代码违反PEP8建议时,这里是pythonic方式:始终使用def语句,而不是将lambda表达式直接绑定到标识符的赋值语句。第一种形式表示结果函数对象的名称是“f”,而不是泛型。这通常对于回溯和字符串表示更有用。赋值语句的使用消除了lambda表达式相对于显式def语句所能提供的唯一好处,即它可以嵌入到更大的表达式中。讽刺的是,引用PEP8,第一段本身明确声明:正如PEP 20所说,可读性很重要。风格指南是关于一致性的。与本风格指南保持一致非常重要。项目内的一致性更为重要。一个模块或功能内的一致性是最重要的。但是,要知道什么时候应该前后不一致——有时候风格指南的建议根本不适用。当有疑问时,运用你的最佳判断。抱歉,我无意冒犯您:虽然我确实了解您的来历,但从可读性的角度来看,我更喜欢使用lambda函数进行1行返回。起初我把所有的代码塞进了一行,但这看起来很糟糕!应该想到链子,是的。谢谢分享答案!应该 我想到了锁链,是的。谢谢分享答案!