在理解期间检查词典中的键

时间:2018-04-18 14:42:03

标签: python python-3.x dictionary counter

是否可以做这样的事情:

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,如果理解甚至可能会很奇怪吗?

3 个答案:

答案 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]}

相关:Create List of Single Item Repeated n Times in Python