我[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]
是已在列表
在此先感謝您的幫助!
我[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]
是已在列表
在此先感謝您的幫助!
你可以只遍歷列表,並檢查是否爲項目的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)]
從可讀性/可維護性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()
實際上,如果'[b,j]'不在列表中? –
只需迭代列表並與每個元素的組件進行比較,或者如果性能更爲重要,請創建所有i和j的集合並檢查它們。 –
@tobias_k對,我們應該只添加元素,如果它是第二個索引(在[6,1]中它是1)不等於列表中的任何第一個索引 –