我有一个如下所示的排序列表:
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语句得到结果。我做错了吗?
答案 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
会将列表删除,直到第一次出现。通过从原始列表的长度中减去之后的项目(数量),我们得到了索引。
答案 5 :(得分:0)
首先:
for i in range(1, 100):
if i >= 3:
break
destroyTheInterwebz()
print i
永远不会执行最后一个功能。这将是onmy peint 1
和2
。因为break
立即离开了循环; not 等待当前迭代完成。
在我看来,如果您使用函数indexOf
和return
而不是break
,代码会更好。
最后但同样重要的是:这里的数据结构相当昂贵。您可能希望使用整数而不是字符串和numpy数组。然后,您可以使用非常快的numpy.searchsorted
函数。