1

我是 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']]...

为冗长复杂的愚蠢代码道歉....任何反馈将不胜感激..谢谢

4

4 回答 4

2

为什么不使用dict?

A = {}
A['abc'] = 'bcd'
A['abc1'] = 'bcd1'

然后,根据需要A['abc']返回'bcd'

您可以访问 IDA.keys()和项目A.values(),这样您就不会失去任何功能。

正如@Stals 在评论中指出的那样,如果您想保留添加内容的顺序,您也可以使用OrderedDict.

如果您确实需要多个具有相同 ID 的物品,则有多种方法multidict可能会奏效。

于 2012-10-03T14:56:27.163 回答
1

其他人已经解释了如何使其工作;我将解释为什么你所拥有的不起作用。

这里的问题是 Python 正在做你告诉它做的事情:

for self.ID in self.itemlist:
         result.append(self.itemlist)
  1. 在一个循环self.ID中,按顺序设置为每个元素self.itemlist。(顺便说一下,完全没有必要为此使用实例属性,因为ID方法完成时不需要保留;您可能应该在此处使用局部变量。)

  2. 每次通过循环时,都会附加self.itemlist对结果的引用。

换句话说,您正在从您的 中请求单个项目self.itemlist,但没有对这些项目做任何事情。您的所有附加操作都会附加原始列表,而不是列表中的当前项目。

因此,您的方法会返回一个列表,其中包含与self.itemlist其中元素一样多的副本。

于 2012-10-03T15:05:06.420 回答
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, [])
于 2012-10-03T14:58:29.217 回答
0

你的get_item代码很混乱。当它应该只读取它时,它会覆盖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 的内置函数可以稍微改进此代码。例如,您可以使用zip- 它可以同时获取您的列表(IDitemlist),并返回成对的相应项目 - 所以,您有:

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)]
于 2012-10-03T15:06:34.773 回答