2016-10-28 3 views
0

У меня есть список [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] уже в списке

Заранее благодарим за помощь!

+1

Вы на самом деле имеете в виду, если '[b, j]' нет в списке? –

+1

Просто переберите список и сравните с компонентами каждого элемента, или если производительность более важна, создайте наборы всех i и j и проверьте их. –

+0

@tobias_k right, мы должны добавлять элементы только в том случае, если это второй индекс (в [6,1] он равен 1) не равен ни одному из первых индексов в списке –

ответ

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)]

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