根据值切片列表

时间:2015-03-10 00:52:40

标签: python list

我在python中有一个排序列表(没有重复项),就像这样,

l = [1, 3, 5, 8, 9, 11, 13, 17]

我想根据列表值进行分析。因此,如果感兴趣的值是,那么我想在列表中找到这个值,并在列表中获得3个值。

我可以通过以下功能实现我的目标

def f(k):
    if k in l:
        i = l.index(k)
        return (l[i-2:i+1])
    else:
        pass


print (f(5))

[1, 3, 5]


print (f(13))

[9, 11, 13]

但是,我有两个问题。如果感兴趣的价值不是列表成员,我不知道该怎么做。 f(6)也应该返回[1,3,5]。我不知道如何在此列表中找到6

是否有一些' pythonic'这样做的方法

4 个答案:

答案 0 :(得分:4)

你可以使用:

 less_values = [x for x in l if x < 5]

这应该是一个包含所有小于5的值的新列表

在那里你可以轻松选择最后3个值

答案 1 :(得分:3)

我会采取一种方式,因为列表已经排序,没有重复,那么你应该使用某种形式的二进制搜索。 Python方便地将bisect模块作为标准库的一部分。

<强>代码

import bisect

data = [1, 3, 5, 6, 8, 9, 11, 13, 17]
for val in range(19):
    pos = bisect.bisect_right(data, val)
    print val, '->', data[max(0, pos-3):pos]

<强>输出

0 -> []
1 -> [1]
2 -> [1]
3 -> [1, 3]
4 -> [1, 3]
5 -> [1, 3, 5]
6 -> [3, 5, 6]
7 -> [3, 5, 6]
8 -> [5, 6, 8]
9 -> [6, 8, 9]
10 -> [6, 8, 9]
11 -> [8, 9, 11]
12 -> [8, 9, 11]
13 -> [9, 11, 13]
14 -> [9, 11, 13]
15 -> [9, 11, 13]
16 -> [9, 11, 13]
17 -> [11, 13, 17]
18 -> [11, 13, 17]

答案 2 :(得分:0)

Python的数组切片表示法:

array[:end]      # items from the beginning through end-1

所以

array[:5] would be what you needed

所以你能做的是:

v = 5
l = [1, 3, 5, 8, 9, 11, 13, 17]
if v in l:
  # do stuff
  print l[:l.index(v)]

输出:

[1, 3]

对于否定这一点的人:

v = 6
l = [1, 3, 5, 8, 9, 11, 13, 17]
if v in l:
  # do stuff
  print l[:l.index(v)]
else:
  print "value is not in the list"

什么都不输出,但这不是问题。我只是没有用适当的else语句处理异常。

答案 3 :(得分:-2)

您可以使用索引进行搜索:

l.index(5)