关于基本的Python列表索引

时间:2016-04-11 13:33:15

标签: python list indexing

我不确定之前是否曾经问过这个似乎是一个简单的问题,我试图搜索它但没有找到一个很好的答案。

说我有一个数字列表a。我知道我可以通过a[::5]获得每五个数字。

获取列表其余部分的最简单方法是什么(a但不在a[::5]中?

修改
这与Finding elements not in a list不是同一个问题,因为我已经知道列表的其余部分由a[1::5]+a[2::5]+a[3::5]+a[4::5]组成,我只是问它是否有更简单的方法/语法糖?

修改
谢谢大家的回答 是否有解决方案没有扫描整个列表?

6 个答案:

答案 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]

当list包含相同的元素时,

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]