我有一个字典,并希望将其中的一部分传递给一个函数,该部分由一个列表(或元组)给出.像这样:
# the dictionary
d = {1:2, 3:4, 5:6, 7:8}
# the subset of keys I'm interested in
l = (1,5)
Run Code Online (Sandbox Code Playgroud)
现在,理想情况下我希望能够做到这一点:
>>> d[l]
{1:2, 5:6}
Run Code Online (Sandbox Code Playgroud)
...但这不起作用,因为它会寻找一个名为的钥匙(1,5).并且d[1,5]甚至不是有效的Python(虽然看起来它会很方便).
我知道我可以这样做:
>>> dict([(key, value) for key,value in d.iteritems() if key in l])
{1: 2, 5: 6}
Run Code Online (Sandbox Code Playgroud)
或这个:
>>> dict([(key, d[key]) for key in l])
Run Code Online (Sandbox Code Playgroud)
这更紧凑...但我觉得必须有一个"更好"的方式来做到这一点.我错过了更优雅的解决方案吗?
(我使用的是Python 2.7)
是否有一种很好的linqy方式将a FormCollection分成Dictionary<string,string>只包含那些以某个字符串开头的键?
(这个问题与this->基本相同,但是对于C#/ FormCollection而不是python 通过以某个字符串开头的键来切片字典)
以下是我想出来解决问题的方法:
public ActionResult Save(FormCollection formCollection) {
var appSettings = new Dictionary<string, string>();
var appKeys = formCollection.AllKeys.Where(k => k.StartsWith("AppSettings."));
foreach (var key in appKeys)
{
appSettings[key] = formCollection[key];
}
...
Run Code Online (Sandbox Code Playgroud)
编辑:这段代码的问题在于,我必须多次为不同的StartsWith字符串执行此操作,因此需要创建一个"实用程序"方法来执行上述操作.如果能在一行中读取它会很好:
formCollection.Where(k=>k.Key.StartsWith("AppSettings.");
Run Code Online (Sandbox Code Playgroud)
背景(没有必要解决问题):上下文是asp.net mvc,以及带有动态字典字典的表单.
它也类似于这个问题 - 返回带有前缀的FormCollection项目 - 但不完全相同.
并阅读了这个答案如何从具有复杂键的FormCollection构建C#对象 - 我开始怀疑我是否会更好,甚至不使用表单发布,而是发送JSON代替.