Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中构造具有多个特征的元素_Python_Arrays_Python 3.x_Dictionary - Fatal编程技术网

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

如何在Python中构造具有多个特征的元素,python,arrays,python-3.x,dictionary,Python,Arrays,Python 3.x,Dictionary,如果我有一组元素(a、B、C、D…),它们都有两个或两个以上的特征(每一个都有一种颜色、一个形状等),我如何制作一个结构,以便我可以轻松地要求所有绿色元素或所有周围元素的列表? 我曾想过使用字典,但我不知道这是否是实现这一目标的最有效方法。我知道每个物体的每个特征值永远不会改变。没有很多特征,但是有很多对象 以下是一组场景的外观: test = {'ob1': {'color': ['green'], 'shape': 'round'}, 'ob

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

以下是一组场景的外观:

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

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

我不确定您的数据是什么样的,因此很难提出建议,但这看起来像是熊猫的工作。Pandas可以创建一个基本上像电子表格一样工作的数据框架。导入数据后,可以根据特征进行过滤和排序。不过,在大多数情况下,字典还是可以的。请参阅。

通常情况下,问题会显示非工作代码,以获取帮助工作的答案

一种方法是使用一个字典,其键是特征,每个值是另一个字典,其键是每个属性的可能值。它的值将是一组具有给定属性值的元素

所有的绿色元素都将被删除

elements['colour']['green']
所有的元素都是

elements['shape']['circle']
通过使用集合操作,将很容易找到圆形的绿色对象,例如

elements['colour']['green'].intersection(elements['shape']['circle'])

您可以使用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')

在我看来,熊猫是一种很好的方式。但你当然可以使用字典:

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']
您可以使用以下类:

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

因为您没有提供任何输入和输出。根据你的陈述,我认为更好的结构可能是
class
dict
。如果您可以提供输入,您尝试过什么,以及预期的输出,这将是非常有用的。如果我们可以看到您的代码,我们会说如果使用dict或类betterI,我正在考虑这个解决方案,但是如果dict1中有很多元素,这不是需要很长时间吗?在这种情况下,panda是一个更有效的解决方案吗?很可能是因为它必须迭代每个键。正如我在解决方案中所说,我可能只会在列上使用pandas和filter。我只是提供了一个用字典来提供选项的解决方案。我考虑过这个解决方案,但我被告知,对于具有变化特征的对象,类更有效。由于我的集合将保持不变,我认为创建一个字典会更方便。问题可以有多种解决方案。当然,你可以使用字典解决这个问题。这个方法看起来不错,但是有没有办法知道给定元素的其他特征(例如,如果我们有str'jack',我们怎么知道'jack'是颜色:绿色,大小:12,id:34?)我不确定我是否明白你的问题。请你再解释一遍好吗?如果元素有一个标识符,如“id”或“name”,并且你想从元素\u DB中提取单个元素,你必须使用dict并将标识符用作键。在我的示例字典中,如果我编写
test['ob1']
,我将获得ob1的所有属性。如果我编写
测试['ob1']['color']
,我会更精确地得到它的颜色。例如,我可以用你制作的元素\u DB做类似的事情吗?编辑:好的,谢谢。所以我必须使用字典和命名的双重结构来做我想做的事情?不,你不能,因为元素\u DB没有键。当你调用'test['ob1']'您指向一个对象。您无法通过这种方式找到所有的'绿色'元素。因此,您需要解释您要调用的查询类型。namedtuple效率更高,并为开发人员提供'强类型'(e['color']vs e.color])