是否可以做这样的事情:
l = [1, 2, 2, 3, 4, 4, 1, 1]
d = {num: [num] if num not in d else d[num].append(num) for num in l}
如果不首先声明d = {}
,我本不会这么认为;即便如此,它也不会附加:
Output: {1: [1], 2: [2], 3: [3], 4: [4]}
# desired: {1: [1, 1, 1], 2: [2, 2], 3: [3], 4: [4, 4]}
可以使用defaultdict
,如果理解甚至可能会很奇怪吗?
答案 0 :(得分:3)
d在你的词典理解中不存在。 为什么不:
iterator = dataset.make_one_shot_iterator()
features_batch, label_batch = iterator.get_next()
# Use the `features_batch` and `label_batch` tensors as the inputs to
# the model, rather than fetching them and feeding them via the `Session`
# interface.
train_op = build_model(features_batch, label_batch)
编辑:我认为,最好在那里使用循环
l = [1, 2, 2, 3, 4, 4, 1, 1]
d = {num: [num] * l.count(num) for num in set(l)}
答案 1 :(得分:2)
不,这是不可能的。如果你想一想,那将是有道理的。当Python评估赋值语句时,它首先评估赋值的右侧 - 表达式。由于尚未评估整个作业,左侧的变量尚未添加到当前名称空间。因此,在计算表达式时,变量将是未定义的。
根据建议,您可以使用collections.defaultdict
来完成您想要的任务:
>>> from collections import defaultdict
>>>
>>> l = [1, 2, 2, 3, 4, 4, 1, 1]
>>> d = defaultdict(list)
>>> for num in l:
d[num].append(num)
>>> d
defaultdict(<class 'list'>, {1: [1, 1, 1], 2: [2, 2], 3: [3], 4: [4, 4]})
>>>
答案 2 :(得分:1)
不,在将理解分配给变量之前,您无法参考列表推导。
但您可以使用collections.Counter
来限制那些代价高昂的list.append
来电。
from collections import Counter
l = [1, 2, 2, 3, 4, 4, 1, 1]
c = Counter(l)
d = {k: [k]*v for k, v in c.items()}
# {1: [1, 1, 1], 2: [2, 2], 3: [3], 4: [4, 4]}