从概念上讲,这就是我想要做的事情:
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。
答案 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()
将从字典中获取密钥的值,如果不存在,则None
。import 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);
}
}
}
默认值也可以设置为第二个参数。