如何在Python中构造具有多个特征的元素

时间:2019-02-19 16:35:05

标签: python arrays python-3.x dictionary

如果我的一组元素(A,B,C,D ...)都具有两个或多个特征(每个特征都有颜色,形状等),我该如何制作一个结构,以便我可以轻松地请求所有绿色元素或所有圆形元素的列表?
我曾想过要使用字典,但我不知道这是否是实现这一目标的最有效方法。我知道每个对象的每个特征的值永远不会改变。没有很多特征,但是有很多对象。

这是一个集合的样子:

test = {'ob1': {'color': ['green'], 
                'shape': 'round'},
        'ob2': {'color': ['red'], 
                'shape': 'round'},
        'ob3': {'color': ['green', 'yellow'], 
                'shape': 'cubic'}
        }

如果我想获取所有绿色对象,我想以一种简单的方法来获取包含[ob1,ob2]的列表。但同时,我希望仍然能够轻松找到给定对象的属性(例如,我想知道obj1的颜色和形状是什么)。

5 个答案:

答案 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))