我有2个名单:
x_int_loc = [0,1,2,3,4,5]
xtremes = [[0,2],[0,3],[1,3],[1,5],[2,5],[3,6],[4,8]]
我正在尝试收集x_int_loc
中每个元素在xtremes
列表中的值范围内的次数。也就是说,1
(在列表x_int_loc
中)的计数将为2
,因为它显示在[0,2]
,[0,3]
中,依此类推。
虽然这看起来很简单,但在循环浏览这些列表时我有点卡住了。这是我的代码:
for i in range(len(x_int_loc)):
while k < len(xtremes):
if x_int_loc[i]>xtremes[k][0] and xtremes[k][1] > x_int_loc[i]:
count[i] = count[i]+1
print(count[:])
你们有没有人能告诉我哪里出错了?
答案 0 :(得分:2)
您永远不会递增k
,或在i
递增时重置它。最小的修复是:
for i in range(len(x_int_loc)):
k = 0
while k < len(xtremes):
if x_int_loc[i]>xtremes[k][0] and xtremes[k][1] > x_int_loc[i]:
count[i] = count[i]+1
k += 1
使用带有手动索引的while
循环不是一个好习惯;正如这清楚地表明,它容易出错。为什么不直接for
循环xtremes
?你真正需要的只是:
count = [sum(x < n < y for x, y in xtremes) for n in x_int_loc]
给了我:
>>> count
[0, 2, 3, 2, 3, 2]
答案 1 :(得分:1)
除非您过于专注于优化,否则在一般情况下,以下解决方案将是最佳的
>>> x_int_loc = [0,1,2,3,4,5]
>>> xtremes = [[0,2],[0,3],[1,3],[1,5],[2,5],[3,6],[4,8]]
>>> xtremes_ranges = [xrange(r[0]+1,r[1]) for r in xtremes]
>>> [(x, sum(x in r for r in xtremes_ranges)) for x in x_int_loc]
[(0, 0), (1, 2), (2, 3), (3, 2), (4, 3), (5, 2)]