pythonic(3)将列表的2个字典映射到1个字典列表中的方法

时间:2019-09-22 12:46:08

标签: python-3.x list dictionary list-comprehension

类似于:

num_dict  = {'number':[1,2,3]}
lett_dict = {'letter': ['a','b','c']}

成为:

[{'number':1,'letter':'a'},{'number':2,'letter':'b'},{'number':3,'letter':'c'}]

编辑

换句话说:

{'number': [1, 2, 3], 'letter': ['a', 'b', 'c'],'symbol':['$','%','^']}

成为

[{'number':1,'letter':'a','symbol':'$'},{'number':2,'letter':'b','symbol':'%'},{'number':3,'letter':'c','symbol':'^'}]

4 个答案:

答案 0 :(得分:1)

我能想到的最pythonic的方式是使用列表理解:

// path to the static react build directory    
const frontend = path.join(__dirname, 'react-app/build');

// map the requests to the static react build directory
app.use('/', express.static(frontend));

// all the unknown requests are redirected to the react SPA
app.use(function (req, res, next) {
    res.sendFile(path.join(frontend, 'index.html'));
});

[{'number':n, 'letter':l} for n,l in zip(list(num_dict.values())[0], list(lett_dict.values())[0])] 用于从一个循环中返回两个值的组合值,而使用zip是因为将dict值转换为列表时,它会返回一个列表列表,例如[0]因此[['a', 'b', 'c']]仅用于获取内部列表,其余部分似乎很明显。

答案 1 :(得分:1)

这是一种方法

[{'number': n, 'letter': l} for n, l in zip(num_dict['number'], lett_dict['letter'])]

答案 2 :(得分:0)

一些猛烈的撞击之后:

<AnchorPane fx:id="anchorPane" id="AnchorPane" prefHeight="597.0" prefWidth="726.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.homeo.home.FXMLDocumentController" />

结果:

>>> d = {'number': [1, 2, 3], 'letter': ['a', 'b', 'c'],'symbol':['$','%','^']}

>>> [dict(zip(d.keys(), v)) for v in zip(*(d[k] for k in d.keys()))]

答案 3 :(得分:0)

老实说,我不知道“ pythonic”在实践中是什么意思。

您给出了两个潜在问题的不同示例。如果您需要通用解决方案,则可以使用辅助功能。

from typing import *

def zip_dict(*dicts: Dict[str, Iterable[Any]],
        keys: Optional[Iterable[str]] = None
    ) -> Iterable[Dict[str, Any]]:
        use_keys = keys if keys is not None else list(map(lambda d: next(iter(d.keys())), dicts))
        indexed_dicts = {k: dicts[i][k] for i, k in enumerate(use_keys)}
        ret_length = len(dicts[0][use_keys[0]])
        return[
            dict((k, indexed_dicts[k][i]) for k in use_keys)
            for i in range(ret_length)
        ]

#test it out
from pprint import pprint

test_data = {'number': [1, 2, 3], 'letter': ['a', 'b', 'c'],'symbol':['$','%','^']}

first_test = zip_dict({'number': test_data['number']}, {'letter': test_data['letter']})
pprint(first_test)

second_test = zip_dict(test_data, test_data, test_data, keys = ['number', 'letter','symbol'])
pprint(second_test)

打印:

[{'letter': 'a', 'number': 1},
 {'letter': 'b', 'number': 2},
 {'letter': 'c', 'number': 3}]
[{'letter': 'a', 'number': 1, 'symbol': '$'},
 {'letter': 'b', 'number': 2, 'symbol': '%'},
 {'letter': 'c', 'number': 3, 'symbol': '^'}]

您会注意到,我没有做出任何努力来防止此函数引发错误,或指定该函数应如何处理“怪异”输入。我不知道你的背景是什么;如果输入“应该”始终正确地成形,那么可能很好。