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'

A.keys()ID とアイテムにアクセスできる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コードは非常に混乱しています。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 に答える
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 を指定してオブジェクトのリストを取得できるようにする必要があります。これは、辞書を使用してより適切に実行できます

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 に答える