基本上,我正在尝试删除所有以相同值开头的列表。例如,下面的两个以数字1开头:
a = [[1,2],[1,0],[2,4],[3,5]]
因为值1存在于两个列表的开头-我需要删除两个列表,以便新列表变为:
b = [[2,4],[3,5]]
我该怎么做?
我尝试了以下操作,但输出为:[[1, 2], [2, 4], [3, 5]]
def unique_by_first_n(n, coll):
seen = set()
for item in coll:
compare = tuple(item[:n])
print compare # Keep only the first `n` elements in the set
if compare not in seen:
seen.add(compare)
yield item
a = [[1,2],[1,0],[2,4],[3,5]]
filtered_list = list(unique_by_first_n(1, a))
答案 0 :(得分:6)
一种有效的解决方案是创建一个Counter
对象来保存第一个元素的出现,然后过滤主列表中的子列表:
from collections import Counter
counts = Counter(l[0] for l in a)
filtered = [l for l in a if counts[l[0]] == 1]
#[[2, 4], [3, 5]]
答案 1 :(得分:6)
如果您愿意使用第三方库,则可以使用熊猫:
import pandas as pd
a = [[1,2],[1,0],[2,4],[3,5]]
df = pd.DataFrame(a)
b = df.drop_duplicates(subset=[0], keep=False).values.tolist()
print(b)
[[2, 4], [3, 5]]
技巧是keep=False
参数,在pd.DataFrame.drop_duplicates
的文档中有描述。
答案 2 :(得分:5)
您可以结合使用collections.Counter
和列表理解功能来获得仅显示一次的子列表:
from collections import Counter
c = Counter(n for n, _ in a)
b = [[x, y] for x, y in a if c[x] == 1]
答案 3 :(得分:0)
解决方案1
a = [[1,2],[1,0],[2,4],[3,5]]
b = []
for item in a:
i = 0
if item[0] == a[i][0]:
i =+ 1
continue
else:
b.append(item)
i += 1
解决方案2
a = [[1,2],[1,0],[2,4],[3,5]]
b = []
for item in a:
for i in range(0, len(a)):
if item[0] == a[i][0]:
break
else:
if item in b:
continue
else:
b.append(item)
输出
(xenial)vash@localhost:~/pcc/10$ python3 remove_help.py [[1, 2], [1, 0], [2, 4], [3, 5]] [[2, 4], [3, 5]]
实现您的目标,不会涉及复杂的方法! 享受吧!