我有一个像这样的列表,并且在循环中添加了新内容。

list = [("banana", "a", 0), ("banana", "b", 1), ("coconut", "a", 2)]


在循环中,我想添加以下项目:

list.append(("strawberry", "b", 4))


但是,如果该序列中的第一项和第二项已经一起在列表中,则不会发生这种情况。例如,以下列表不能添加到list,因为第一项已经包含“香蕉”和“ a”。

("banana", "a", 5) # Should NOT be appended
("banana", "c", 6) # SHOULD be appended
("strawberry", "a", 7) # SHOULD be appended


在常规列表中,我们将执行以下操作以避免重复:

if not item in list:
  list.append(item)


但请注意,我的情况仅涉及部分重复,即子列表之间的前两项不能相同。

我正在寻找一种非常有效的解决方案,因为该列表可以包含数千个项目。

最佳答案

我强烈建议对这种类型的数据耦合结构使用字典,以及O(1)查找时间,您还将实现更好的设计。但是,您可以使用以下方法对当前数据结构执行此操作:

样本输出:

当前结构:

l = [ ("banana", "a", 0), ("banana", "b", 1), ("coconut", "a", 2) ]
items_to_add = [("banana", "a", 5), ("banana", "c", 6), ("strawberry", "a", 7)]

for item_to_add in items_to_add:
    if not item_to_add[:2] in [i[:2] for i in l]:
        l.append(item_to_add)
print l
>>> [('banana', 'a', 0), ('banana', 'b', 1), ('coconut', 'a', 2),
('banana', 'c', 6), ('strawberry', 'a', 7)]


否则,您可以使用字典(将您的前两个元素分解为关键字):

带字典:

d = { ("banana", "a") : 0, ("banana", "b") : 1, ("coconut", "a") : 2 }
items_to_add = [("banana", "a", 5), ("banana", "c", 6), ("strawberry", "a", 7)]

for item_to_add in items_to_add:
    key = item_to_add[:2]
    value = item_to_add[-1]
    if not key in d:
        d[key] = value
print d
>>> {('coconut', 'a'): 2, ('strawberry', 'a'): 7, ('banana', 'c'): 6,
('banana', 'a'): 0, ('banana', 'b'): 1}


当您尝试利用键/值数据结构的属性时,字典在这种情况下非常有效。确保唯一密钥,这也是最有效的途径。

关于python - 仅将三项中三项中的两项相比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38833937/

10-13 04:06