2016-10-28 19 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]は、セット内に存在しない場合)

[1,2][1,3]がリストに既に

であるので、そう要素 [6,1]は、追加すべきではありません

ご協力いただきありがとうございます!

+1

'[b、j]'がリストにない場合は、実際にはどういう意味ですか? –

+1

リストを反復して各要素の要素と比較するか、パフォーマンスがより重要な場合は、すべてのiとjのセットを作成してチェックしてください。 –

+0

@tobias_k右、2番目のインデックス([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() 
関連する問題