2011-10-09 68 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”为列表,或者“元组(一)”得到它作为元组。