如果我的一组元素(A,B,C,D ...)都具有两个或多个特征(每个特征都有颜色,形状等),我该如何制作一个结构,以便我可以轻松地请求所有绿色元素或所有圆形元素的列表?
我曾想过要使用字典,但我不知道这是否是实现这一目标的最有效方法。我知道每个对象的每个特征的值永远不会改变。没有很多特征,但是有很多对象。
这是一个集合的样子:
test = {'ob1': {'color': ['green'],
'shape': 'round'},
'ob2': {'color': ['red'],
'shape': 'round'},
'ob3': {'color': ['green', 'yellow'],
'shape': 'cubic'}
}
如果我想获取所有绿色对象,我想以一种简单的方法来获取包含[ob1,ob2]的列表。但同时,我希望仍然能够轻松找到给定对象的属性(例如,我想知道obj1的颜色和形状是什么)。
答案 0 :(得分:4)
您可以使用namedtuple,这是一种有效的数据格式。
from collections import namedtuple
Element = namedtuple('Element', 'color size id name')
ELEMENTS_DB = {'e1':Element('green', 12, 34, 'jack'),
'e2':Element('blue', 132, 334, 'dan'),
'e3':Element('green', 142, 434, 'ben')}
# get green elements
green_elements = [e for e in ELEMENTS_DB.values() if e.color == 'green']
print(green_elements)
# get 'e3'
print(ELEMENTS_DB['e3'])
输出:
[Element(color='green', size=12, id=34, name='jack'), Element(color='green',
size=142, id=434, name='ben')]
Element(color='green', size=142, id=434, name='ben')
答案 1 :(得分:1)
我不确定您的数据是什么样的,因此很难提出建议,但这看起来像是pandas
的工作。熊猫可以创建一个基本上像电子表格一样的数据框。导入数据后,您可以根据特征进行过滤和排序。字典在大多数情况下都可以。参见pandas documentation。
答案 2 :(得分:1)
在我看来,熊猫是一种很好的方法。但是您当然可以使用字典:
elements = ['A', 'B', 'C', 'D']
colors = ['red','red', 'blue', 'red']
shapes = ['square', 'circle', 'circle', 'triangle']
dict1 = { element: {'color':colors[index], 'shape':shapes[index]} for index,element in enumerate(elements)}
def find_keys(keyword):
result = []
for key, val in dict1.items():
for k, v in val.items():
if v == keyword:
result.append(key)
return result
print (find_keys('red'))
输出:
print (find_keys('red'))
['A', 'B', 'D']
print (find_keys('circle'))
['B', 'C']
答案 3 :(得分:0)
通常情况下,问题会显示无法正常工作的代码,以寻求帮助以帮助工作。
一种实现此目的的方法是拥有一个字典,其键是特征,每个值是另一个字典,其键是每个属性的可能值。它的值将是一组具有给定属性值的元素。
所有绿色元素将变为
elements['colour']['green']
所有圆形元素都是
elements['shape']['circle']
通过使用设置操作,将很容易找到圆形的绿色对象,例如,使用
elements['colour']['green'].intersection(elements['shape']['circle'])
答案 4 :(得分:0)
您可以使用类:
class element:
def __init__(self,shape,color):
self.shape=shape
self.color=color
查询功能:
def query(data,shape=None,color=None):
if shape:
data=[x for x in data if x.shape==shape]
if color:
data=[x for x in data if x.color==color]
return data
使用:
red_circle=element("circle","red")
red_square=element("square","red")
blue_circle=element("circle","blue")
blue_square=element("square","blue")
data=[red_circle,red_square,blue_circle,blue_square]
qdata=query(data,color="blue")
for x in qdata:
print("shape: {} - color: {}".format(x.shape,x.color))