0

エントリが 1 回だけリストに追加されるようにするにはどうすればよいですか? 一部の(指定された)列に一致する場合、別のエントリが追加されないようにしたい。

4

1 に答える 1

0

ウィジェットやデータ ストレージに重複が追加されるのを防ぐ方法はいくつかあります。私が時々使用する方法は、ObjectListView ウィジェットなど、何かに既に追加したオブジェクトを追跡し、それを追加したい新しいオブジェクトと比較することです。たとえば、小さな 16 進コード ジェネレーターを作成してみましょう。

import random

used_num = []

def gen_ran_num():
    val = ''.join([random.choice('0123456789ABCDEF') for x in range(6)])
    if val not in used_num:
        used_num.append(val)
        return val

コード スニペットでは、生成された 16 進コードを格納する変数が作成されました。関数は 16 進コードを生成し、コードが既に作成されているかどうかを確認します。コードが used_num 変数にまだ存在しない場合は、それを追加して値を返します。

このようなものを使用して、重複した情報が ObjectListView に追加されるのを防ぐことができると思います。

時間があれば、サンプル コードを追加して回答を編集します。

--編集-- OK、これが私の提案の簡単なサンプルです。

import wx
from ObjectListView import FastObjectListView, ColumnDefn

sample_data = (
    {'id': 1, 'days': 5, 'notes': 10},
    {'id': 2, 'days': 3, 'notes': 1},
    {'id': 3, 'days': 5, 'notes': 10},
    {'id': 4, 'days': 7, 'notes': 0},
    {'id': 5, 'days': 1, 'notes': 1},
    {'id': 1, 'days': 5, 'notes': 10},
    {'id': 2, 'days': 3, 'notes': 1},
    {'id': 2, 'days': 3, 'notes': 1},
    {'id': 1, 'days': 5, 'notes': 10},
    {'id': 4, 'days': 7, 'notes': 0},
    {'id': 6, 'days': 2, 'notes': 11}
  )

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY,
            title='Sample App')
        _pnl = wx.Panel(self, wx.ID_ANY)
        self.dataOLV = FastObjectListView(_pnl, wx.ID_ANY,
                            style=wx.LC_REPORT|wx.SUNKEN_BORDER)
        self.dataOLV.Hide()
        self.added_to_olv = []
        _sizer = wx.BoxSizer(wx.VERTICAL)
        _sizer.Add(self.dataOLV, 1, wx.ALL|wx.EXPAND, 5)
        _pnl.SetSizerAndFit(_sizer)
        self.SetColumns()
        self.SetData()
        self.Layout()

    def SetColumns(self):
        olvColumns = [
            ColumnDefn('ID',  'left', 155, 'id'),
            ColumnDefn('Issue Length', 'right', 35, 'days'),
            ColumnDefn('# of Notes', 'right', 35, 'notes')
        ]
        self.dataOLV.SetColumns(olvColumns)

    def SetData(self):
        for item in sample_data:
            if item['id'] not in self.added_to_olv:
                self.added_to_olv.append(item['id'])
                self.dataOLV.AddObject(item)
        self.dataOLV.RefreshObjects()
        self.dataOLV.Show()

def RunApp():
    app = wx.App()
    frame = MainFrame()
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    RunApp()

この例では、ディクショナリを使用して、ObjectListView に表示されるデータを格納しています。プログラムを実行すると、FastObjectListView ウィジェットが作成されますが、まだ列やデータがないため非表示になります。次に、関数を実行して列を作成し、続いてウィジェットに入力して表示する関数を実行します。このサンプル アプリは、最大 100 行を表示し、さまざまな量の重複を表示してテストしました。重複する行は表示されませんでした。

-マイク・S

于 2014-02-28T17:11:22.640 に答える