Python:从itemlist中获取项目

时间:2012-10-03 14:52:51

标签: 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 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 ;]] ...

道歉为长期复杂的愚蠢看代码....任何反馈都会如此赞赏..谢谢

4 个答案:

答案 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)
  1. 在循环中,按顺序将self.ID设置为self.itemlist的每个元素。 (顺便说一句,完全没必要使用实例属性,因为在方法完成时不需要保留ID;你应该在这里使用局部变量。)

    < / LI>
  2. 每次循环时,都会在结果中添加对self.itemlist的引用。

  3. 换句话说,您要求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 - 这可以同时接收您的列表(IDitemlist),然后返回一对相应的项目 - 所以,您有:

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