Python:从itemlist获取项目
我是python新手,在做一些练习时发现了一些困难 我在一个类下有几个def函数,如下所示:Python:从itemlist获取项目,python,Python,我是python新手,在做一些练习时发现了一些困难 我在一个类下有几个def函数,如下所示: Class A(object): def __init__(self): self.itemID = [] self.itemlist = [] def add(self, ID, list): self.itemID.append(ID) self.itemlist.append(list) def ge
Class A(object):
def __init__(self):
self.itemID = []
self.itemlist = []
def add(self, ID, list):
self.itemID.append(ID)
self.itemlist.append(list)
def get_item(self,ID):
self.ID = ID
result = []
for self.ID in self.itemlist:
result.append(self.itemlist)
return result
def get_item(self,ID):
result = []
for x in range(0, len(self.itemID)):
if (self.itemID[x] == ID):
result.append(self.itemlist[x])
return result
“def get_项目”有问题。这里有一个例子
如果我这样做:
A.add('abc', 'bcd')
A.add('abc1', 'bcd1')
A.get_item('abc')
这应该返回abc,bcd,但我的返回['bcd','bcd1'],['bcd','bcd1']]
为那些冗长而复杂的代码道歉。。。。如有任何反馈,将不胜感激。。谢谢为什么不使用
dict
A = {}
A['abc'] = 'bcd'
A['abc1'] = 'bcd1'
然后,A['abc']
根据需要返回'bcd'
您可以使用A.keys()
和A.values()
访问ID,这样您就不会丢失任何功能
正如@Stals在评论中指出的,如果您想保留添加内容的顺序,还可以使用
如果您确实需要多个具有相同ID的项目,则有多种
multidict
方法可能有效。您的get\u item函数完全错误:)
下面是它的外观:
Class A(object):
def __init__(self):
self.itemID = []
self.itemlist = []
def add(self, ID, list):
self.itemID.append(ID)
self.itemlist.append(list)
def get_item(self,ID):
self.ID = ID
result = []
for self.ID in self.itemlist:
result.append(self.itemlist)
return result
def get_item(self,ID):
result = []
for x in range(0, len(self.itemID)):
if (self.itemID[x] == ID):
result.append(self.itemlist[x])
return result
或者更好:
def get_item(self, ID):
return [self.itemlist[x] for x in range(0, len(self.itemID) if self.itemID[x] == ID]
现在,如果我理解了类背后的逻辑,您希望能够检索给定公共ID的对象列表
class A:
def __init__(self):
self.content = {}
def add(self, ID, object):
list = self.get_item(ID)
list.append(object)
content[ID] = list
def get_item(self, ID):
return content.get(ID, [])
其他人则解释了如何使其发挥作用;我要解释为什么你的东西不管用 这里的问题是Python完全按照您的要求执行:
for self.ID in self.itemlist:
result.append(self.itemlist)
self.ID
设置为self.itemlist
的每个元素。(顺便说一下,完全没有必要为此使用实例属性,因为在方法完成时不需要保留ID
;您可能应该在此处使用局部变量。)self.itemlist
的引用self.itemlist
中请求单个项目,但没有对这些项目执行任何操作。所有追加操作都追加原始列表,而不是列表中的当前项
因此,您的方法返回一个列表,其中包含的
self.itemlist
副本数量与其中的元素数量相同。您的get\u item
代码非常混乱。当它只应该读取self.ID时,它会多次覆盖self.ID,循环会将整个itemlist(或者更确切地说,itemlist本身)附加到结果中,并且在每次迭代中都会这样做。这就是为什么你会看到如此奇怪的结果
您可能想到的是:
def get_item(self, ID):
for index in range(self.ID.length):
if self.id[index] == ID:
return self.itemlist[index]
也就是说:迭代两个列表的索引,当您在ID列表中找到在该位置具有匹配ID的列表时,在itemlist
中返回相应位置的内容
通过使用Python的内置函数,可以稍微改进此代码。例如,您可以使用-它可以获取您的列表(ID
和itemlist
),并返回相应的项目对-因此,您有:
def get_item(self, ID):
for id, item in zip(self.ID, self.itemlist):
if id == ID:
return item
但是您可以使用-list完全摆脱循环。index
为您执行搜索:
def get_item(self, ID):
return self.itemlist[self.ID.index(ID)]
我猜,原因是因为他想要有多个具有相同ID的项。也可以使用dict来完成。只是不像给定的示例那么简单。嗯,他正在尝试返回一个对象列表。并且在add函数中无法控制ID的存在。除非,这完全是一种误解:)