使用条件语法从列表创建字典理解
Create dictionary comprehension from list with condition syntax
我想使用字典理解语法创建字典。
请注意,列表 l
包含字符串元组和第一个元素始终为时间戳的元组。
这个有效:
d = {}
for entry in l:
if entry[0] not in d:
d[entry[0]] = []
d[entry[0]].append(entry)
这不起作用:
d = {k[0].append(k) for k in l if k[0] in d else k[0]:k for k in l}
File "<stdin>", line 1
d = {k[0].append(k) for k in l if k[0] in d else k[0]:k for k in l}
^
SyntaxError: invalid syntax
你不能为此使用字典理解。对于每个迭代步骤(如果未过滤),都会生成一个新的键值对。这意味着您无法更新另一个已生成的键值对。
坚持循环。您可以使用 dict.setdefault()
:
来简化它
d = {}
for entry in l:
d.setdefault(entry[0], []).append(entry)
请注意,在字典理解完成之前,您的示例中的 d
将不存在;只有这样 d
才会绑定到结果。更具体地解决语法错误,Python 将 :
之前的部分视为单独的表达式以生成键值对中的键,并且正在解析 for ... in ...
语法作为生成器表达式(理解语法的一种形式);您可以在这样的表达式中使用 if
进行过滤,但是在理解中没有 else
部分可能,因此错误指向 else
那里。
我想使用字典理解语法创建字典。
请注意,列表 l
包含字符串元组和第一个元素始终为时间戳的元组。
这个有效:
d = {}
for entry in l:
if entry[0] not in d:
d[entry[0]] = []
d[entry[0]].append(entry)
这不起作用:
d = {k[0].append(k) for k in l if k[0] in d else k[0]:k for k in l}
File "<stdin>", line 1
d = {k[0].append(k) for k in l if k[0] in d else k[0]:k for k in l}
^
SyntaxError: invalid syntax
你不能为此使用字典理解。对于每个迭代步骤(如果未过滤),都会生成一个新的键值对。这意味着您无法更新另一个已生成的键值对。
坚持循环。您可以使用 dict.setdefault()
:
d = {}
for entry in l:
d.setdefault(entry[0], []).append(entry)
请注意,在字典理解完成之前,您的示例中的 d
将不存在;只有这样 d
才会绑定到结果。更具体地解决语法错误,Python 将 :
之前的部分视为单独的表达式以生成键值对中的键,并且正在解析 for ... in ...
语法作为生成器表达式(理解语法的一种形式);您可以在这样的表达式中使用 if
进行过滤,但是在理解中没有 else
部分可能,因此错误指向 else
那里。