如何在添加项目前检查列表?

时间:2016-10-28 09:47:46

标签: python list

我有一个[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]已在列表中

提前感谢您的帮助!

2 个答案:

答案 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()