2011-10-09 77 views
3

我有一個列表列表的TList。如果以前不存在,我想將新項目添加到列表中。例如,如果項目I不存在,則添加到Tlist中,否則跳過。是否存在更加pythonic的方式?注意:起初,TList可能爲空,並且此代碼中添加了元素。例如,在添加Z之後,TList = [[A,B,C],[D,F,G],[H,I,J],[Z,aa,bb]]。其他元素的基礎上Z.搜索並添加一個python列表

item = 'C' # for example this item will given by user 
    TList = [ [A,B,C],[D,F,G],[H,I,J]] 
    if not TList: 
     ## do something 
     # check if files not previously present in our TList and then add to our TList 
    elif item not in zip(*TList)[0]: 
     ## do something 
+1

將上面的'TList'添加一個新條目(稱爲'Z')的結果是什麼? – NPE

+0

@aix我編輯添加這個信息的問題 – user974168

+0

@user:好像你想要一個['set']的功能(http://docs.python.org/library/stdtypes.html#set-types -set-frozenset)。那是對的嗎? –

回答

2

因爲它會出現在每個子列表中的第一項是某種類型的鍵,其餘項目在某種程度上從該密鑰推導計算,一本字典可能一個更合適的數據結構:

vals = {'A': ['B','C'], 'D':['F','G'], 'H':['I','J']} 
if 'Z' in vals: 
    print 'found Z' 
else: 
    vals['Z'] = ['aa','bb'] 
1

,如果你需要保持相同的數據結構,這樣的事情應該工作:

# create a set of already seen items 
seen = set(zip(*TList)[:1]) 

# now start adding new items 
if item not in seen: 
    seen.add(item) 
    # add new sublist to TList 
+0

如果TList爲空,那麼是否會有異常? – user974168

+0

@ user974168。是的,對不起 - 我只是做了一個快速複製和粘貼。我現在糾正了它。 – ekhumoro

1

@aix取得了良好的建議,使用二ct作爲您的數據結構;它似乎很適合你的用例。考慮包裝值檢查(即'是否存在?')和計算派生值(在你的例子中'aa'和'bb'?)。

class TList(object): 
    def __init__(self): 
     self.data = {} 

    def __iter__(self): 
     return iter(self.data) 

    def set(self, key): 
     if key not in self: 
      self.data[key] = self.do_something(key) 

    def get(self, key): 
     return self.data[key] 

    def do_something(self, key): 
     print('Calculating values') 
     return ['aa', 'bb'] 

    def as_old_list(self): 
     return [[k, v[0], v[1]] for k, v in self.data.iteritems()] 

t = TList() 

## Add some values. If new, `do_something()` will be called 
t.set('aval') 
t.set('bval') 
t.set('aval') ## Note, do_something() is not called 

## Get a value 
t.get('aval') 

## 'in ' tests work 
'aval' in t 

## Give you back your old data structure 
t.as_old_list() 
1

下面是使用集和set.union的方法:

a = set(1,2,3) 
b = set(4,5,6) 
c = set() 
master = [a,b,c] 
if 2 in set.union(*master): 
    #Found it, do something 
else: 
    #Not in set, do something else 

如果用於測試成員的原因僅僅是爲了避免增加的條目兩次,該組結構使用a.add(12 )添加一些東西到一個集合,但只添加一次,從而消除了測試的需要。因此,以下內容:

>>> a=set() 
>>> a.add(1) 
>>> a 
set([1]) 
>>> a.add(1) 
>>> a 
set([1]) 

如果您需要設置其他地方的列表,你只說「表(一)」獲得「A」爲列表,或者「元組(一)」得到它作爲元組。