我是蟒蛇新手,在做一些练习时发现了一些困难。
我在类下的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 get_item(self,ID):
self.ID = ID
result = []
for self.ID in self.itemlist:
result.append(self.itemlist)
return result
我遇到了" def get_item"的问题。这是一个例子..
如果我这样做:
A.add('abc', 'bcd')
A.add('abc1', 'bcd1')
A.get_item('abc')
这应该返回abc,bcd但我的返回[[' bcd',' bcd1'],[' bcd',' bcd1&#39 ;]] ...
道歉为长期复杂的愚蠢看代码....任何反馈都会如此赞赏..谢谢
答案 0 :(得分:2)
为什么不使用dict
?
A = {}
A['abc'] = 'bcd'
A['abc1'] = 'bcd1'
然后,A['abc']
会根据需要返回'bcd'
。
您可以使用A.keys()
和A.values()
项访问ID,这样您就不会丢失任何功能。
正如@Stals在评论中指出的那样,如果您想保留添加内容的顺序,您还可以使用OrderedDict
。
如果您确实需要多个具有相同ID的项目,则可以使用各种multidict
项目。
答案 1 :(得分:1)
其他人已经解释了如何使其发挥作用;我要解释为什么你的东西不起作用。
这里的问题是Python正在完全按照你的要求去做:
for self.ID in self.itemlist:
result.append(self.itemlist)
在循环中,按顺序将self.ID
设置为self.itemlist
的每个元素。 (顺便说一句,完全没必要使用实例属性,因为在方法完成时不需要保留ID
;你应该在这里使用局部变量。)
每次循环时,都会在结果中添加对self.itemlist
的引用。
换句话说,您要求self.itemlist
中的单个项目,但不对项目做任何事情。您的所有附加操作都会附加原始列表,而不是列表中的当前项目。
因此,您的方法返回一个列表,其中包含self.itemlist
的副本,其中包含元素。
答案 2 :(得分:0)
你的get_item函数绝对错误:)
以下是它的外观:
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的对象列表。使用dict
可以做得更好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, [])
答案 3 :(得分:0)
您的get_item
代码非常混乱。它会多次覆盖self.ID
,当它只应该读取它时,循环会将整个项目列表(或者更确切地说,项目列表本身)附加到结果中 - 它会在每次迭代。这就是你看到如此奇怪的结果的原因。
你可能想到的是:
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的内置函数可以稍微改进一下这段代码。例如,您可以使用zip
- 这可以同时接收您的列表(ID
和itemlist
),然后返回一对相应的项目 - 所以,您有:
def get_item(self, ID):
for id, item in zip(self.ID, self.itemlist):
if id == ID:
return item
但是你可以使用list methods完全摆脱循环 - list.index
会搜索你:
def get_item(self, ID):
return self.itemlist[self.ID.index(ID)]