在排序列表中查找第一次出现的索引

时间:2016-09-04 15:01:38

标签: python list for-loop

我有一个如下所示的排序列表:

sortedlist = ['0','0','0','1','1,'1,'2',2','3']

我还有一个计数变量:

count = '1'

*注意:有时count可以是一个大于列表中最大值的积分。例如count = '4'

我想要做的是在列表中找到第一次出现的计数并打印索引。如果该值大于列表中的最大值,则分配一个字符串。这是我尝试过的:

maxvalue = max(sortedlist)
for i in sortedlist:
    if int(count) < int(sortedlist[int(i)]):
        indexval = i
        break
        OutputFile.write(''+str(indexval)+'\n')
if int(count) > int(maxvalue):
    indexval = "over"
    OutputFile.write(''+str(indexval)+'\n')

我认为中断会结束for循环,但我只是从最后一个if语句得到结果。我做错了吗?

6 个答案:

答案 0 :(得分:3)

你的逻辑错了,你有一个所谓的排序列表字符串,除非你比较为整数不能正确排序,你应该使用整数 -go和bisect_left找到索引:

from bisect import bisect_left

sortedlist = sorted(map(int, ['0', '0', '0', '1', '1', '1', '2', '2', '3']))

count = 0

def get_val(lst, cn):
    if lst[-1] < cn:
        return "whatever"
    return bisect_left(lst, cn, hi=len(lst) - 1)

如果值根据您的要求落在两个之间,您将获得较高值的第一个索引,如果您得到完全匹配,您将获得该索引:

In [13]: lst = [0,0,2,2]

In [14]: get_val(lst, 1)
Out[14]: 2

In [15]: lst = [0,0,1,1,2,2,2,3]

In [16]: get_val(lst, 2)
Out[16]: 4

In [17]: get_val(lst, 9)
Out[17]: 'whatever'

答案 1 :(得分:2)

由于这里有一些过于复杂的解决方案,因此可以直截了当地说明这一点:

def get_index(a, L):
    for i, b in enumerate(L):
        if b >= a:
            return i
    return "over"

get_index('1', ['0','0','2','2','3'])
>>> 2
get_index('1', ['0','0','0','1','2','3'])
>>> 3
get_index('4', ['0','0','0','1','2','3'])
>>> 'over'

但是,请使用bisect

答案 2 :(得分:1)

你可以使用一个函数(使用EAFP原理)来查找第一个等于或大于count的事件:

In [239]: l = ['0','0','0','1','1','1','2','2','3']

In [240]: def get_index(count, sorted_list):
     ...:     try:
     ...:         return next(x[0] for x in enumerate(l) if int(x[1]) >= int(count))
     ...:     except StopIteration:
     ...:         return "over"
     ...:     

In [241]: get_index('3', l)
Out[241]: 8

In [242]: get_index('7', l)
Out[242]: 'over'

答案 3 :(得分:0)

由于您的列表已经排序,因此最大值将是列表的最后一个元素,即maxval = sortedlist[-1]。其次你的for循环中有一个错误。 for i in sortedlist:这为您提供了列表中的每个元素。要获取索引,请在范围len(sortedlist)上执行for循环。这里我是列表中的元素。写入文件后应该中断。以下是固定代码:

maxvalue = sortedlist[-1]
if int(count) > int(maxvalue):
    indexval = "over"
    OutputFile.write(''+str(indexval)+'\n')
else:
    for i in xrange(len(sortedlist)):
        if int(count) <= int(sortedlist[int(i)]):
            indexval = i
            OutputFile.write(''+str(indexval)+'\n')
            break

答案 4 :(得分:0)

使用itertools.dropwhile()

from itertools import dropwhile

sortedlist = [0, 0, 0, 1, 1, 1, 2, 2, 3]

def getindex(count):
    index = len(sortedlist) - len(list(dropwhile(lambda x: x < count, sortedlist)))
    return "some_string" if index >= len(sortedlist) else index

测试:

print(getindex(5))
> some_string

print(getindex(3))
> 8

解释

dropwhile()返回item < count时,

False会将列表删除,直到第一次出现。通过从原始列表的长度中减去之后的项目(数量),我们得到了索引。

&#34; an iterator that drops elements from the iterable as long as the predicate is true; afterwards, returns every element。&#34;

答案 5 :(得分:0)

首先:

for i in range(1, 100):
  if i >= 3:
    break
    destroyTheInterwebz()
  print i

永远不会执行最后一个功能。这将是onmy peint 12。因为break 立即离开了循环; not 等待当前迭代完成。

在我看来,如果您使用函数indexOfreturn而不是break,代码会更好。

最后但同样重要的是:这里的数据结构相当昂贵。您可能希望使用整数而不是字符串和numpy数组。然后,您可以使用非常快的numpy.searchsorted函数。