-4

你们能想到任何一个等于 if/else 语句的衬里吗:

d = dict()

key = 1, 2

if key in d:
    d[key]['idx'] += [2]
else:
    d[key] = {'idx': [2]}

print d

?

编辑:谢谢大家。您将我缩小到 collection.defaultdict 和 dict.setdafault 并考虑到这一点,我能够实现我想要的:

from collections import defaultdict

d = dict()
key = 1, 2
d.setdefault(key, {'idx': []})
d[key]['idx'] += [2]

也许它不是一个衬里,因为它分布在 2 行上(setdefault() 调用,然后就地添加),但看起来更好。

但是,如果有人有任何想法如何使它成为真正的一个班轮,请分享它。

4

3 回答 3

3

有时最好在多行中做事,这就是其中一种情况。但是,有时尝试避免这种“此键是否存在”逻辑是合理的,为此您可以使用collections.defaultdictdict.setdefault(). 现在只是为了好玩,这是一个你不应该使用的可怕的单行代码(但在行为上等同于你的 if/else):

d.setdefault(key, {'idx': []})['idx'] += [2] if d[key]['idx'] else [1]

请注意,这比您的原始版本效率低,因为它需要额外的查找,并且每次使用它时都会创建不必要的对象。

于 2012-11-07T00:06:37.797 回答
0

也许:

d = dict()
key = 1,2

d[key] = (d[key]['idx'] + [2] if key in d and 'idx' in d[key] else {'idx': [2]})
于 2012-11-07T01:55:40.740 回答
0
key=1,2
d={key:'idx'}
d[key]['idx'] = d[key]['idx']+[2] if key in d else ['2']
于 2012-11-07T02:48:36.693 回答