用列表作为值构建 Python 字典 - 为什么看似等效的代码会产生不同的结果?

Constructing a Python dict with lists as values - why does seemingly equivalent code gives different results?

提问人:Dave 提问时间:8/13/2019 更新时间:8/13/2019 访问量:38

问:

我希望从另一个字典的键构造一个 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]}

如果有人能向我解释为什么这两段代码会产生不同的结果,我将不胜感激。

python 列表 字典 fromkeys

评论


答:

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