Python:从itemlist获取项目

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

我是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(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的存在。除非,这完全是一种误解:)