自定义 class 使用字典 pythonic
Custom class using dictionary pythonic
2019年4月,我已经做了一道题,而且我已经进步到喜欢了class。
我现在的问题,我的代码是否已经可重用?因为在使用行为添加新数据时我应该重复这个:
self.data[index] = {'weight':weight, 'visual':visual, 'step':step, 'fitness':fitness}
任何建议和支持我,非常感谢你们
python 代码,自定义词典,class python
中词典的包装函数
class Data:
def __init__(self):
self.data = {}
def initial(self, index, weight, visual, step, fitness)
self.data[index] = {'weight':weight, 'visual':visual, 'step':step, 'fitness':fitness}
def add_following(self, index, behavior)
self.data[index] = {'weight':weight, 'visual':visual, 'step':step, 'fitness':fitness, 'following':behavior}
def mod_data(self, index, weight, visual, step, fitness)
self.data[index] = {'weight':weight, 'visual':visual, 'step':step, 'fitness':fitness}
def del_data(self, index)
del self.data[index]
def __iter__(self):
return iter(self.fish)
def keys(self):
return self.data.keys()
def items(self):
return self.data.items()
def values(self):
return self.data.values()
------------------------------------------------------------
import random
data = Data()
data_length = 3
weight_length = 2
visual = [random.random(0,1) for _ in range(data_length)]
weight = [[random.random(0,1) for _ in range(weight_length)] for _ in range(data_length)]
step = [random.random(0,1) for _ in range(data_length)]
behavior = [[random.random(0,1) for _ in range(weight_length)] for _ in range(data_length)]
for index in data.items():
data.initial(index, visual[index], weight[index], step[index], fitness[index])
for beh in data.items():
data.behavior(beh, visual[beh], weight[beh], step[beh], fitness[beh], behavior[beh])
我预期的结果是
0 {{'position': {'current': 0, 'target': [1, 2]}, 'weight': [0.4, 0.5], 'visual': 0.9, 'step': 0.32, 'fitness': 0.2,'following':{[0.4, 0.5], 'swarming':[0.1, 0.2]}
1 {{'position': {'current': 1, 'target': [0, 2]}, 'weight': [0.4, 0.59], 'visual': 0.3, 'step': 0.32, 'fitness': 0.2,'following':{[0.4, 0.5], 'swarming':[0.4, 0.5]}
2 {{'position': {'current': 2, 'target': [0, 1]}, 'weight': [0.41, 0.50], 'visual': 0.97, 'step': 0.75, 'fitness': 0.24,'following':{[0.42, 0.59], 'swarming':[0.21, 0.28]}
根据评论,这里是您可以开始构建的一个可能示例:
通过键 0
、1
、2
、... 表示 list
比 dict
更好的结构来存储值.
在这里,我使用 collections.namedtuple
创建命名元组 Fish
,属性为 weight
、visual
、step
、fitness
、behavior
、following
。 class 的行为就像一个元组,所以你可以把它放在 for-loop
等中。如果你需要更多的定制,我建议定制 class.
在循环中,我根据需要创建尽可能多的 Fish
个实例 - 在本例中为 data_length
:
import random
from collections import namedtuple
Fish = namedtuple('Fish', 'weight visual step fitness behavior following')
data = []
data_length = 3
weight_length = 2
visual = [random.random() for _ in range(data_length)]
weight = [[random.random() for _ in range(weight_length)] for _ in range(data_length)]
step = [random.random() for _ in range(data_length)]
fitness = [random.random() for _ in range(data_length)]
behavior = [[random.random() for _ in range(weight_length)] for _ in range(data_length)]
for _visual, _weight, _step, _behavior, _fitness in zip(visual, weight, step, behavior, fitness):
data.append(Fish(visual=_visual, weight=_weight, step=_step, fitness=_fitness, behavior=_behavior, following={} ))
for idx, item in enumerate(data):
print(idx, item)
打印:
0 Fish(weight=[0.9995716623548419, 0.8374864488049845], visual=0.7545821331560755, step=0.18314419318293407, fitness=0.44659753047474804, behavior=[0.999274242465972, 0.8045066303545176], following={})
1 Fish(weight=[0.774064177559705, 0.8007058597932238], visual=0.040803565655900376, step=0.06891491826550344, fitness=0.8789611721939403, behavior=[0.231633308916408, 0.7496932726479902], following={})
2 Fish(weight=[0.3625792694324431, 0.46596868362347066], visual=0.20884834045098444, step=0.5649025875470652, fitness=0.27357142247178146, behavior=[0.12066601826166246, 0.3992293204074744], following={})
# You can acces the date like this:
data[0].following['some data'] = 1.234
print(data[0])
打印:
Fish(weight=[0.9995716623548419, 0.8374864488049845], visual=0.7545821331560755, step=0.18314419318293407, fitness=0.44659753047474804, behavior=[0.999274242465972, 0.8045066303545176], following={'some data': 1.234})
2019年4月,我已经做了一道题
我现在的问题,我的代码是否已经可重用?因为在使用行为添加新数据时我应该重复这个:
self.data[index] = {'weight':weight, 'visual':visual, 'step':step, 'fitness':fitness}
任何建议和支持我,非常感谢你们
python 代码,自定义词典,class python
中词典的包装函数
class Data:
def __init__(self):
self.data = {}
def initial(self, index, weight, visual, step, fitness)
self.data[index] = {'weight':weight, 'visual':visual, 'step':step, 'fitness':fitness}
def add_following(self, index, behavior)
self.data[index] = {'weight':weight, 'visual':visual, 'step':step, 'fitness':fitness, 'following':behavior}
def mod_data(self, index, weight, visual, step, fitness)
self.data[index] = {'weight':weight, 'visual':visual, 'step':step, 'fitness':fitness}
def del_data(self, index)
del self.data[index]
def __iter__(self):
return iter(self.fish)
def keys(self):
return self.data.keys()
def items(self):
return self.data.items()
def values(self):
return self.data.values()
------------------------------------------------------------
import random
data = Data()
data_length = 3
weight_length = 2
visual = [random.random(0,1) for _ in range(data_length)]
weight = [[random.random(0,1) for _ in range(weight_length)] for _ in range(data_length)]
step = [random.random(0,1) for _ in range(data_length)]
behavior = [[random.random(0,1) for _ in range(weight_length)] for _ in range(data_length)]
for index in data.items():
data.initial(index, visual[index], weight[index], step[index], fitness[index])
for beh in data.items():
data.behavior(beh, visual[beh], weight[beh], step[beh], fitness[beh], behavior[beh])
我预期的结果是
0 {{'position': {'current': 0, 'target': [1, 2]}, 'weight': [0.4, 0.5], 'visual': 0.9, 'step': 0.32, 'fitness': 0.2,'following':{[0.4, 0.5], 'swarming':[0.1, 0.2]}
1 {{'position': {'current': 1, 'target': [0, 2]}, 'weight': [0.4, 0.59], 'visual': 0.3, 'step': 0.32, 'fitness': 0.2,'following':{[0.4, 0.5], 'swarming':[0.4, 0.5]}
2 {{'position': {'current': 2, 'target': [0, 1]}, 'weight': [0.41, 0.50], 'visual': 0.97, 'step': 0.75, 'fitness': 0.24,'following':{[0.42, 0.59], 'swarming':[0.21, 0.28]}
根据评论,这里是您可以开始构建的一个可能示例:
通过键 0
、1
、2
、... 表示 list
比 dict
更好的结构来存储值.
在这里,我使用 collections.namedtuple
创建命名元组 Fish
,属性为 weight
、visual
、step
、fitness
、behavior
、following
。 class 的行为就像一个元组,所以你可以把它放在 for-loop
等中。如果你需要更多的定制,我建议定制 class.
在循环中,我根据需要创建尽可能多的 Fish
个实例 - 在本例中为 data_length
:
import random
from collections import namedtuple
Fish = namedtuple('Fish', 'weight visual step fitness behavior following')
data = []
data_length = 3
weight_length = 2
visual = [random.random() for _ in range(data_length)]
weight = [[random.random() for _ in range(weight_length)] for _ in range(data_length)]
step = [random.random() for _ in range(data_length)]
fitness = [random.random() for _ in range(data_length)]
behavior = [[random.random() for _ in range(weight_length)] for _ in range(data_length)]
for _visual, _weight, _step, _behavior, _fitness in zip(visual, weight, step, behavior, fitness):
data.append(Fish(visual=_visual, weight=_weight, step=_step, fitness=_fitness, behavior=_behavior, following={} ))
for idx, item in enumerate(data):
print(idx, item)
打印:
0 Fish(weight=[0.9995716623548419, 0.8374864488049845], visual=0.7545821331560755, step=0.18314419318293407, fitness=0.44659753047474804, behavior=[0.999274242465972, 0.8045066303545176], following={})
1 Fish(weight=[0.774064177559705, 0.8007058597932238], visual=0.040803565655900376, step=0.06891491826550344, fitness=0.8789611721939403, behavior=[0.231633308916408, 0.7496932726479902], following={})
2 Fish(weight=[0.3625792694324431, 0.46596868362347066], visual=0.20884834045098444, step=0.5649025875470652, fitness=0.27357142247178146, behavior=[0.12066601826166246, 0.3992293204074744], following={})
# You can acces the date like this:
data[0].following['some data'] = 1.234
print(data[0])
打印:
Fish(weight=[0.9995716623548419, 0.8374864488049845], visual=0.7545821331560755, step=0.18314419318293407, fitness=0.44659753047474804, behavior=[0.999274242465972, 0.8045066303545176], following={'some data': 1.234})