2016-10-28 58 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對,我們應該只添加元素,如果它是第二個索引(在[6,1]中它是1)不等於列表中的任何第一個索引 –

回答

2

你可以只遍歷列表,並檢查是否爲項目的any(i,j)在列表中,i是一樣的,你要添加的項目(a,b)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()