我有一个[i,j]值列表:
lst = [[1,2],[1,3],[3,4],[4,6]]
#[1,2] means that i=1 and j=2
并添加新的elenemt [a,b]
,例如[6,1]
,如何通过条件为我的lst添加值
(仅当集合中不存在[a,b]
时才添加元素[b,j]
因此不应添加元素[6,1]
,因为[1,2]
和[1,3]
已在列表中
提前感谢您的帮助!
答案 0 :(得分:2)
您可以迭代列表并检查列表中any
项(i,j)
是否i
与项b
中的(a,b)
相同你要添加。 (至少我是如何理解你的病情的,但如果情况略有不同,这应该很容易适应。)
def cond_add(lst, item):
a, b = item
if not any(i == b for (i, j) in lst):
lst.append(item)
lst = [[1,2],[1,3],[3,4],[4,6]]
cond_add(lst, [6,1])
cond_add(lst, [6,5])
print(lst)
如果要添加多个元素,则需要从第一个元素创建set
,这样您就可以对每个项目进行恒定时间的检查。 (您可以为添加单个元素执行相同操作,但是您必须在每个项目后更新该集合。)
def cond_add_many(lst, items):
first = set(i for (i, j) in lst)
for (a,b) in items:
if b not in first:
lst.append((a,b))
first.add(a)
lst = [[1,2],[1,3],[3,4],[4,6]]
cond_add_many(lst, [[6,1], [6,5], [7,6]])
print(lst)
之后,在这两种情况下,lst
都是[[1, 2], [1, 3], [3, 4], [4, 6], (6, 5)]
答案 1 :(得分:2)
从可读性/可维护性POV开始,我通常更喜欢使用处理不变量的自定义类:
# XXX poor naming but I don't know enough of the context
class Container(object):
def __init__(self, *initvals):
self._values = []
self._keys = set()
for pair in initvals:
self.add(pair)
def add(self, pair):
if pair[1] in self._keys:
raise ValueError("second item of pair '{}' already set".format(pair))
self._keys.add(pair[0])
self._values.append(pair)
def values(self):
# returns a copy so no one accidentally messes
# with internal state
return self._values[:]
c = Container((1,2), (1,3), (3,4), (4,6))
c.add((8, 9))
assert (8, 9) in c.values(), "(8,9) not correctly added"
try:
c.add((6, 1))
except ValueError as e:
#print "got error {} when adding (6,1)".format(e)
pass
else:
assert False, "adding (6, 1) should have raised a ValueError"
print c.values()