我不确定之前是否曾经问过这个似乎是一个简单的问题,我试图搜索它但没有找到一个很好的答案。
说我有一个数字列表a
。我知道我可以通过a[::5]
获得每五个数字。
获取列表其余部分的最简单方法是什么(a
但不在a[::5]
中?
修改:
这与Finding elements not in a list不是同一个问题,因为我已经知道列表的其余部分由a[1::5]+a[2::5]+a[3::5]+a[4::5]
组成,我只是问它是否有更简单的方法/语法糖?
修改:
谢谢大家的回答
是否有解决方案没有扫描整个列表?
答案 0 :(得分:2)
我会从以下内容开始:
[v for v in a if v not in a[::5]]
将不需要的值存储在set
之前可能会导致更好的性能,因为not in
方法位于O(1)
的集合中:
unwanted = set(a[::5])
[v for v in a if v not in unwanted]
如果数据量巨大,bloom filter可能是一个很好的替代品。
答案 1 :(得分:2)
[x for i, x in enumerate(a) if i % 5 != 0]
not in set(a[::5])
将无法正常工作。从性能的角度来看,not in a[::5]
也不是最优的。
编辑 Python中的问题没有语法糖。看看numpy:它有广泛的切片可能性。
修改要避免列表扫描,您可以使用__getitem__
方法创建包装类。
答案 2 :(得分:0)
这对你有帮助吗?
items = [1,2,3,4]
Z = [3,4,5,6]
a = list(set(items)-set(Z))
# a =[1, 2]
如:
fifths = a[::5]
not_fifths = list(set(a)-set(fifths))
答案 3 :(得分:0)
temp = [x for x in a if x not in a[::5]]
答案 4 :(得分:0)
你可以试试这个:
[a[i-1] for i in range(1, len(a) + 1) if i % 5]
基本上,它检查每个位置以查看它是否是5的倍数。您不必以这种方式创建一个集合对象。
答案 5 :(得分:0)
这样做,没有任何索引查找开销。
result = [n for i,n in enumerate(a) if i % 5 != 0]