Cor*_*man 5 python tuples list
我想从第一个元素相同的列表中删除元组,因为我将字母对视为具有相同的值,尽管它们有序.这是我试图迭代的列表,称为tuples2:
[(3, 'A', 'C'), (3, 'C', 'A'), (2, 'B', 'C'), (2, 'C', 'B'), (1, 'A', 'B'), (1, 'B', 'A')]
Run Code Online (Sandbox Code Playgroud)
我目前的代码:
for i in list(tuples2):
if i[0] == i+1[0]:
tuples2.remove(i)
print tuples2
Run Code Online (Sandbox Code Playgroud)
...抛出这个错误:
line 6: if i[0] == (i+1)[0]: TypeError: can only concatenate tuple (not "int") to tuple
Run Code Online (Sandbox Code Playgroud)
如果我想结束,我该如何修改我的代码以解决这个问题
[(3, 'A', 'C'), (2, 'B', 'C'), (1, 'A', 'B')]呢?
这段代码中有很多危险信号。您不应该修改正在迭代的列表,这将导致您停止跳过项目。编辑我现在看到您在 for 循环中复制了列表,但是以下方法仍然更安全一些。您可以向后迭代,但构建新列表可能更容易。一种简单的方法是跟踪已经见过的第一个元素,并且仅在您之前没有见过第一个元素时才添加:
In [1]: data = [(3, 'A', 'C'), (3, 'C', 'A'), (2, 'B', 'C'), (2, 'C', 'B'), (1, 'A', 'B'), (1, 'B', 'A')]
...:
In [2]: seen = set()
In [3]: new_data = []
...: for triple in data:
...: first = triple[0]
...: if first in seen:
...: continue
...: seen.add(first)
...: new_data.append(triple)
...:
In [4]: new_data
Out[4]: [(3, 'A', 'C'), (2, 'B', 'C'), (1, 'A', 'B')]
Run Code Online (Sandbox Code Playgroud)
使用.remove效率非常低。它将您的算法更改为 O(n^2) 而不是 O(n)。