提问人:Dave 提问时间:8/13/2019 更新时间:8/13/2019 访问量:38
用列表作为值构建 Python 字典 - 为什么看似等效的代码会产生不同的结果?
Constructing a Python dict with lists as values - why does seemingly equivalent code gives different results?
问:
我希望从另一个字典的键构造一个 Python,并构建新列表以用作 dict 值。我写了两段代码,我认为它们是等效的,但事实并非如此。dict
我更喜欢第一段代码,因为它没有在循环中使用新的列表对象,也没有在第二段代码中使用末尾的额外赋值行。我希望使用会消除对这些的需求,并使代码更整洁/更具可读性。dict.fromkeys()
代码 1:
class_list = ['a','b','c','d']
X_classes = {'foo':['a','b'],'bar':['c','d']}
X_indices = dict.fromkeys(X_classes,[]) # i.e., {'foo':[],'bar':[]}
for xc in X_classes.items():
for c in xc[1]:
X_indices[xc[0]].append(class_list.index(c))
代码 2:
class_list = ['a','b','c','d']
X_classes = {'foo':['a','b'],'bar':['c','d']}
X_indices = {}
for xc in X_classes.items():
indices = []
for c in xc[1]:
indices.append(class_list.index(c))
X_indices[xc[0]] = indices
代码 1 产生意外结果: 。这促使我编写了代码 2,它产生了预期的结果:X_indices = {'foo':[0,1,2,3],'bar':[0,1,2,3]}
X_indices = {'foo':[0,1],'bar':[2,3]}
如果有人能向我解释为什么这两段代码会产生不同的结果,我将不胜感激。
答:
2赞
Daniel Roseman
8/13/2019
#1
因为使用您给它的对象作为值:也就是说,每次都使用相同的对象。因此,字典中的每个值都是对同一列表的引用。dict.fromkeys
fromkeys
仅对不可变值(例如字符串或整数)真正有用。
但是,一个更简洁的实现是使用列表推导式。另请注意,您可以在遍历项目的迭代中使用元组解包。
for k, v in X_classes.items():
X_indices[k] = [class_list.index(c) for c in v]
评论
0赞
Dave
8/13/2019
非常清楚的解释 - 我现在可以看到在这种情况下不适用。此外,我真的很喜欢使用元组解包和列表推导来整理代码。fromkeys
评论