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