Python:使用lambda从列表中使用列表推导创建字典

时间:2015-11-04 04:04:06

标签: python dictionary lambda list-comprehension

从概念上讲,这就是我想要做的事情:

lookup = {'A': 'aaa', 'B': 'bbb', 'C': 'ccc'}
keys = ['A', 'B', 'Z'] # Note 'Z' does not exist in dict
result = {}
for key in keys:
    if key in lookup:
        result[key] = lookup[key]
    else:
        result[key] = None

以上代码产生以下内容,即

# result == {'A': 'aaa', 'Z': None, 'B': 'bbb'}

根据this post about dictionary comprehension syntax中的建议,我可以使用v2.6语法执行以下操作:

result = dict((lambda x: (x, lookup[x]) if x in lookup else (x, None))(key) for key in keys)

哪种方法有效并产生相同的结果。

但是,我希望能够在v2.7风格中执行以下操作(也在上面的帖子中提到)。但这似乎不起作用,

result = { (lambda x: x: a_dict[x] if x in a_dict else x: None)(key) for key in a_list }

我似乎在lambda中使用:与表示密钥的行为相冲突。我也回顾了original PEP中给出的例子。他们也没有提供任何指导。以下是命令行的输出:

>>> result = { (lambda x: x : a_dict[x] if x in a_dict else x: None)(key) for key in a_list }
  File "<stdin>", line 1
    result = { (lambda x: x : a_dict[x] if x in a_dict else x: None)(key) for key in a_list }
                            ^
SyntaxError: invalid syntax

我做错了什么?是否有可能做我想做的事情,即使用lambda的字典理解的v2.7语法?

请注意,我只是出于好奇而要求 ;并不是说我有强迫写这样的生产代码,需要专家才能理解!

PS:我应该提一下我在尝试这样做时发现的其他两个相关帖子。首先是using lambda in list comprehension.而另一个是creating a dictionary using list

2 个答案:

答案 0 :(得分:4)

要使用字典理解进行尝试,您应该使用dict.get()方法。示例 -

>>> lookup = {'A': 'aaa', 'B': 'bbb', 'C': 'ccc'}
>>> keys = ['A', 'B', 'Z']
>>> result = {key:lookup.get(key) for key in keys}
>>> result
{'Z': None, 'A': 'aaa', 'B': 'bbb'}
如果字典中没有键,则

dict.get()返回None。您还可以指定dict.get()的第二个参数,如果您尝试获取的密钥不在字典中,则该参数将是返回的默认值。

要回答这个问题,你不能使用lambda在词典理解中返回类似键值对的内容(因为:语法无效)。如果你想这样做,你应该使用dict()函数和生成器表达式,例如 -

result = dict((lambda x: (x,a_dict[x]) if x in a_dict else (x,None))(key) for key in a_list)

或更具可读性的map()版本 -

result = dict(map((lambda x: (x,a_dict[x]) if x in a_dict else (x,None)), a_list)

答案 1 :(得分:1)

您尝试做的事情可以通过简单的词典理解来完成:

result = {k: lookup.get(k) for k in keys}

k将成为关键,lookup.get(k)将成为价值。 .get()将从字典中获取密钥的值,如果不存在,则Noneimport java.io.*; import static java.lang.System.*; import java.util.Scanner; import java.lang.Math; class Main{ public static void main (String str[]) throws IOException { Scanner scan = new Scanner(System.in); char letter; int i; System.out.println("Enter the first String:"); String wc = scan.nextLine(); System.out.println("Enter the replacement String:"); String replace = scan.nextLine(); String my_new_str = wc.replaceAll("*", replace); for (i = 0; i < wc.length(); i++) { letter = wc.charAt(i); if (! (letter == '*')){ System.out.println("Error: no *");} System.out.println(""+ my_new_str); } } } 默认值也可以设置为第二个参数。