我有一个TList列表。如果之前没有新项目,我想在列表中添加新项目。例如,如果项目I不存在,则添加到Tlist,否则跳过。有更多pythonic方式吗?注意:首先TList可能为空,并且在此代码中添加了元素。例如,在添加Z之后,TList = [[A,B,C],[D,F,G],[H,I,J],[Z,aa,bb]]。其他要素基于对Z的计算。
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
答案 0 :(得分:2)
由于看起来每个子列表中的第一个条目是某种键,而其余条目以某种方式从该键派生,因此字典可能是更合适的数据结构:
vals = {'A': ['B','C'], 'D':['F','G'], 'H':['I','J']}
if 'Z' in vals:
print 'found Z'
else:
vals['Z'] = ['aa','bb']
答案 1 :(得分: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
答案 2 :(得分:1)
@aix提出了一个很好的建议,使用dict作为你的数据结构;它似乎很适合您的用例。
考虑结束价值检查(即'它存在吗?')和派生值的计算(例子中的'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()
答案 3 :(得分:1)
这是一个使用sets和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
如果测试成员资格的原因只是为了避免两次添加条目,则set结构使用a.add(12)向集合添加内容,但只添加一次,从而无需测试。因此如下:
>>> a=set()
>>> a.add(1)
>>> a
set([1])
>>> a.add(1)
>>> a
set([1])
如果您需要将其他地方设置为列表,您只需说" list(a)"获得" a"作为列表,或"元组(a)"把它作为一个元组。