使dictionary在Python类中可迭代


python类中的Noob。尝试在类内进行迭代。这个问题有什么解决办法吗?
# some dict
d_init = {'a': 'a_value', 'b': 'b_value', 'c': 'c_value'}

# class 1
class Store1:
def __init__(self, input_dict):
self.class_dict = input_dict

# class 2
class Store2:
def __init__(self, input_dict):
self.res = []
self.class_dict = input_dict
self.class_list = [self.res.append(self.class_dict[k1]) for k1 in self.class_dict.keys()]

obj1 = Store1(d_init)
print("iter 1 = ", [obj1.class_dict[k] for k in obj1.class_dict.keys()])

obj2 = Store2(d_init)
print("iter 2 = ", obj2.class_list)

输出:

iter 1 = ['a_value', 'b_value', 'c_value']
iter 2 = [None, None, None]

期望输出:

iter 1 = ['a_value', 'b_value', 'c_value']
iter 2 = ['a_value', 'b_value', 'c_value']
self.class_list = [self.res.append(self.class_dict[k1]) for k1 in self.class_dict.keys()]

这里的这个只会附加self.res,所以你应该返回self.res并删除class_list,或者删除self-res并将代码更改为

self.class_list = [self.class_dict[k1] for k1 in self.class_dict.keys()]
# class 2
class Store2:
def __init__(self, input_dict):
self.class_dict = input_dict
self.class_list = [self.class_dict[k1] for k1 in self.class_dict]
# or
self.class_list = list(self.class_dict.values())

您误解了列表理解-

self.class_list = [self.res.append(self.class_dict[k1]) for k1 in self.class_dict.keys()]

这将在self.class_list内存储.append结果的列表(并且.append显然将返回None(。实际值会按照您的命令附加到self.res。如果您打印obj2.res,您就会得到所需的结果。

如果您希望dict值在class_list中,为什么要附加到一个完全不同的列表中?为什么不只是

self.class_list = [self.class_dict[k1] for k1 in self.class_dict.keys()]

更好的是,所有这些从dict中获取值的列表理解都可以很容易地简化为-

list(self.class_dict.values())

或者如果你喜欢打高尔夫球-

[*self.class_dict.values()]

简短回答:
更改

print("iter 2 = ", obj2.class_list)


更好的答案:

print("iter 2 = ", obj2.res)

当您使用列表理解,并使用迭代的返回值在内部执行方法时。它留下了None数据类型,因为您将输出转移到了Store2类的self.res。因此,[无,无,无]。要使self.class_list等于self.res,可以这样做。。

# class 2
class Store2:
def __init__(self, input_dict):
self.res = []
self.class_dict = input_dict
## run the list comp. after setup of 'res' and 'class_dict'
[self.res.append(self.class_dict[k1]) for k1 in self.class_dict.keys()]
## the local scope of class [None, None, None] value, will be trashed
## thanks python, for the dynamic cleanup   :D
self.class_list = self.res.copy()
obj2 = Store2(d_init)
print("iter 2 = ", obj2.class_list)

输出

iter 2 = ['a_value', 'b_value', 'c_value']

最新更新